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