códigos estructurado de excepciones se definen a través de números NTSTATUS. Aunque alguien de MS suggests usando FormatMessage() para convertir números NTSTATUS en cadenas, yo no haría esto. La bandera FORMAT_MESSAGE_FROM_SYSTEM
se utiliza para convertir el resultado de GetLastError() en una cadena, por lo que no tiene sentido aquí. El uso del indicador FORMAT_MESSAGE_FROM_HMODULE
junto con ntdll.dll
dará resultados incorrectos para algunos códigos. Por ejemplo, para EXCEPTION_ACCESS_VIOLATION
obtendrá The instruction at 0x
, que no es muy informativo :).
Cuando observa las cadenas que están almacenadas en ntdll.dll
resulta obvio que se supone que muchas de ellas se utilizan con la función printf(), no con el FormatMessage(). Por ejemplo, la cadena de EXCEPTION_ACCESS_VIOLATION
es:
The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s.
%0
se trata por FormatMessage() como la secuencia de escape que significa mensaje terminador, no un inserto. Las inserciones son% 1 a% 99. Es por eso que flag FORMAT_MESSAGE_IGNORE_INSERTS
no hace ninguna diferencia.
Es posible que desee cargar la cadena de ntdll.dll
y pasarlo a vprintf pero se necesita para preparar argumentos exactamente como está previsto por la cadena (por ejemplo, para EXCEPTION_ACCESS_VIOLATION
es unsigned long
, unsigned long
, char*
). Y este enfoque tiene un gran inconveniente: cualquier cambio en el número, orden o tamaño de los argumentos en ntdll.dll
puede romper su código.
Por lo tanto, es más seguro y fácil codificar las cadenas en su propio código. Me parece peligroso usar cadenas preparadas por otra persona sin coordinación conmigo :) y, además, para otra función. Esta es solo una posibilidad más de mal funcionamiento.
Sí, 'FormatMessage' debe hacer el truco. – avakar