valor una tipos sirve que producto porter para michael mckinsey hacer elementos ejemplo como cadena c++ windows winapi clr hresult

c++ - tipos - ¿Hay alguna forma de obtener la representación de cadena del valor de HRESULT con la API de ganancia?



para que sirve la cadena de valor (3)

¿Hay una función en win API que se pueda usar para extraer la representación de cadena del valor de HRESULT?

El problema es que no todos los valores de retorno 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.


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()


La API de Windows para esto es FormatMessage . Aquí hay un enlace que explica cómo hacerlo: Cómo obtener descripciones de mensajes de error utilizando la API de FormatMessage .

Para los mensajes de Win32 (mensajes con 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.


Puedes usar _com_error :

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

Si no desea utilizar _com_error por el motivo que sea, aún puede ver su origen y ver cómo se hace.

No olvides incluir el encabezado comdef.h