win API 中是否有可用于提取 HRESULT 值的字符串表示形式的函数?
问题是并非所有的返回值都记录在 MSDN 中,例如ExecuteInDefaultAppDomain()函数没有记录为返回“0x80070002 - 系统找不到指定的文件。”,但是,确实如此!因此,我想知道是否有在常见情况下使用的功能。
您可以使用_com_error:
_com_error err(hr);
LPCTSTR errMsg = err.ErrorMessage();
如果你出于某种原因不想使用_com_error
,你仍然可以看看它的源代码,看看它是如何完成的。
不要忘记包含标题comdef.h
从 c++11 开始,此功能内置于标准库中:
#include <system_error>
std::string message = std::system_category().message(hr)
用于此的 Windows API 是FormatMessage。这是一个解释如何执行此操作的链接:检索错误消息。
对于 Win32 消息(HRESULT 以 0x8007 开头的消息,即 FACILITY_WIN32),您需要删除 hi 顺序词。例如在 0x80070002 中,您需要使用 0x0002 调用 FormatMessage。
但是,它并不总是适用于任何类型的消息。而对于一些特定的消息(特定于某个技术、某个供应商等),您需要加载相应的资源DLL,这并不总是一件容易的事,因为您需要找到这个DLL。
这是使用 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()