没有:
MFC
ATL
如何使用FormatMessage()
获取错误文本HRESULT
?
HRESULT hresult = application.CreateInstance("Excel.Application"); if (FAILED(hresult)) { // what should i put here to obtain a human-readable // description of the error? exit (hresult); }
Shog9.. 128
这是从系统中获取错误消息的正确方法HRESULT
(在这种情况下命名为hresult,或者您可以替换它GetLastError()
):
LPTSTR errorText = NULL; FormatMessage( // use system message tables to retrieve error text FORMAT_MESSAGE_FROM_SYSTEM // allocate buffer on local heap for error text |FORMAT_MESSAGE_ALLOCATE_BUFFER // Important! will fail otherwise, since we're not // (and CANNOT) pass insertion parameters |FORMAT_MESSAGE_IGNORE_INSERTS, NULL, // unused with FORMAT_MESSAGE_FROM_SYSTEM hresult, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&errorText, // output 0, // minimum size for output buffer NULL); // arguments - see note if ( NULL != errorText ) { // ... do something with the string `errorText` - log it, display it to the user, etc. // release memory allocated by FormatMessage() LocalFree(errorText); errorText = NULL; }
这与David Hanak的答案之间的关键区别在于使用FORMAT_MESSAGE_IGNORE_INSERTS
旗帜.MSDN对如何使用插入有点不清楚,但是Raymond Chen指出在检索系统消息时不应该使用它们,因为你无法知道系统期望的插入.
FWIW,如果您使用的是Visual C++,那么使用_com_error
该类可以让您的生活更轻松:
{ _com_error error(hresult); LPCTSTR errorText = error.ErrorMessage(); // do something with the error... //automatic cleanup when error goes out of scope }
据我所知,直接不是MFC或ATL的一部分.
这是从系统中获取错误消息的正确方法HRESULT
(在这种情况下命名为hresult,或者您可以替换它GetLastError()
):
LPTSTR errorText = NULL; FormatMessage( // use system message tables to retrieve error text FORMAT_MESSAGE_FROM_SYSTEM // allocate buffer on local heap for error text |FORMAT_MESSAGE_ALLOCATE_BUFFER // Important! will fail otherwise, since we're not // (and CANNOT) pass insertion parameters |FORMAT_MESSAGE_IGNORE_INSERTS, NULL, // unused with FORMAT_MESSAGE_FROM_SYSTEM hresult, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&errorText, // output 0, // minimum size for output buffer NULL); // arguments - see note if ( NULL != errorText ) { // ... do something with the string `errorText` - log it, display it to the user, etc. // release memory allocated by FormatMessage() LocalFree(errorText); errorText = NULL; }
这与David Hanak的答案之间的关键区别在于使用FORMAT_MESSAGE_IGNORE_INSERTS
旗帜.MSDN对如何使用插入有点不清楚,但是Raymond Chen指出在检索系统消息时不应该使用它们,因为你无法知道系统期望的插入.
FWIW,如果您使用的是Visual C++,那么使用_com_error
该类可以让您的生活更轻松:
{ _com_error error(hresult); LPCTSTR errorText = error.ErrorMessage(); // do something with the error... //automatic cleanup when error goes out of scope }
据我所知,直接不是MFC或ATL的一部分.
请记住,您无法执行以下操作:
{ LPCTSTR errorText = _com_error(hresult).ErrorMessage(); // do something with the error... //automatic cleanup when error goes out of scope }
在堆栈上创建和销毁类时,会将errorText指向无效位置.在大多数情况下,此位置仍将包含错误字符串,但在编写线程应用程序时,这种可能性很快就会消失.
所以总是按照上面Shog9的回答如下:
{ _com_error error(hresult); LPCTSTR errorText = error.ErrorMessage(); // do something with the error... //automatic cleanup when error goes out of scope }
试试这个:
void PrintLastError (const char *msg /* = "Error occurred" */) { DWORD errCode = GetLastError(); char *err; if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, errCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // default language (LPTSTR) &err, 0, NULL)) return; static char buffer[1024]; _snprintf(buffer, sizeof(buffer), "ERROR: %s: %s\n", msg, err); OutputDebugString(buffer); // or otherwise log it LocalFree(err); }