这是从系统返回错误消息的正确方法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;
}
这与大卫哈纳克的答案之间的主要区别在于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 的一部分。