2011-08-10 11 views
39

¿Hay una función en win API que se pueda utilizar para extraer la representación de cadena del valor HRESULT?¿Hay alguna manera de obtener la representación de cadena del valor de HRESULT con la API de ganancia?

El problema es que no todos los valores devueltos están documentados en MSDN, por ejemplo, la función ExecuteInDefaultAppDomain() no está documentada para devolver "0x80070002 - El sistema no puede encontrar el archivo especificado." ¡Sin embargo, sí lo hace! Por lo tanto, me preguntaba si hay una función para ser utilizada en el caso común.

+2

título es diferente, pero esencialmente la respuesta será la misma que la de [esta] (http://stackoverflow.com/questions/455434/how-should -i-use-formatmessage-properly-in-c) one. –

Respuesta

62

Puede utilizar _com_error:

_com_error err(hr); 
LPCTSTR errMsg = err.ErrorMessage(); 

Si no desea utilizar _com_error por cualquier razón, todavía se puede echar un vistazo a su fuente, y ver cómo se hace.

No se olvide de incluir la cabecera comdef.h

+4

Una muestra más completa para su conveniencia: en línea CString GetMessageForHresult (HRESULT hr) { _com_error error (hr); CString cs; cs.Format (_T ("Error 0x% 08x:% s"), hora, error.ErrorMessage()); return cs; } – nietras

+1

archivo de encabezado requerido: #include

12

La API de Windows para esto es FormatMessage. Aquí hay un enlace que explica cómo hacerlo: How to obtain error message descriptions using the FormatMessage API.

Para los mensajes de Win32 (mensajes con un HRESULT que comienza con 0x8007, que es FACILITY_WIN32), debe eliminar la palabra de orden alta. Por ejemplo, en el 0x80070002, debe llamar a FormatMessage con 0x0002.

Sin embargo, no siempre funciona para ningún tipo de mensaje. Y para algunos mensajes específicos (específicos de una tecnología, un proveedor, etc.), debe cargar la DLL de recursos correspondiente, que no siempre es una tarea fácil, porque necesita encontrar esta DLL.

+0

El 7 en 0x8007 es FACILITY_WIN32 y no es FACILITY_ITF. Consulte, por ejemplo, "Estructura de códigos de error COM" en http://msdn.microsoft.com/en-us/library/ms690088 –

+0

@uvts_cvs - sure. mi error. He actualizado la respuesta. –

+0

'HRESULT_CODE (hr)' puede convertir eso en el código de error win32 – Andy

-1

Aquí hay una muestra usando FormatMessage()

LPTSTR SRUTIL_WinErrorMsg(int nErrorCode, LPTSTR pStr, WORD wLength) 
{ 
    try 
    { 
     LPTSTR szBuffer = pStr; 
     int nBufferSize = wLength; 

     // 
     // prime buffer with error code 
     // 
     wsprintf(szBuffer, _T("Error code %u"), nErrorCode); 

     // 
     // if we have a message, replace default with msg. 
     // 
     FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 
       NULL, nErrorCode, 
       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language 
       (LPTSTR) szBuffer, 
       nBufferSize,  
       NULL); 
    } 
    catch(...) 
    { 
    } 
    return pStr; 
} // End of SRUTIL_WinErrorMsg() 
+1

¿Cuál es el punto de la cláusula catch en la función? –

+0

No sabía throws 'FormatMessage' ... – Andy

Cuestiones relacionadas