Esta es la forma correcta de obtener un mensaje de error del sistema para un HRESULT
(llamado hresult en este caso, o puede reemplazarlo por GetLastError()
):
LPTSTR errorText = NULL;
FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM
|FORMAT_MESSAGE_ALLOCATE_BUFFER
|FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
hresult,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&errorText,
0,
NULL);
if ( NULL != errorText )
{
LocalFree(errorText);
errorText = NULL;
}
La diferencia clave entre esto y la respuesta de David Hanak es el uso de la FORMAT_MESSAGE_IGNORE_INSERTS
bandera. MSDN no tiene claro cómo se deben usar las inserciones, pero Raymond Chen señala que nunca debe usarlas al recuperar un mensaje del sistema, ya que no tiene forma de saber qué inserciones espera el sistema.
FWIW, si está usando Visual C ++, puede hacer su vida un poco más fácil usando la _com_error
clase:
{
_com_error error(hresult);
LPCTSTR errorText = error.ErrorMessage();
}
No es parte de MFC o ATL directamente que yo sepa.