win API中是否有函数可用于提取HRESULT值的字符串表示形式?有没有办法使用win API获取HRESULT值的字符串表示?
问题是,并非所有的返回值都记录在MSDN中,例如ExecuteInDefaultAppDomain()函数没有记录为返回“0x80070002 - 系统找不到指定的文件”,但是,它的确如此!因此,我想知道是否有一种常用的功能。
win API中是否有函数可用于提取HRESULT值的字符串表示形式?有没有办法使用win API获取HRESULT值的字符串表示?
问题是,并非所有的返回值都记录在MSDN中,例如ExecuteInDefaultAppDomain()函数没有记录为返回“0x80070002 - 系统找不到指定的文件”,但是,它的确如此!因此,我想知道是否有一种常用的功能。
您可以使用_com_error:
_com_error err(hr);
LPCTSTR errMsg = err.ErrorMessage();
如果你不想使用_com_error
不管什么原因,你仍然可以看看它的来源,看看它是如何做。
不要忘了包括头comdef.h
为了方便起见,更完整的示例: inline CString GetMessageForHresult(HRESULT hr) { _com_error error(hr); CString cs;cs.Format(_T(“Error 0x%08x:%s”),hr,error.ErrorMessage()); return cs; } – nietras
需要头文件:#include
这个在Windows API是FormatMessage。这里是一个链接,说明如何做到这一点:How to obtain error message descriptions using the FormatMessage API。
对于Win32消息(HRESULT以0x8007开头的消息,即FACILITY_WIN32),您需要删除hi命令字。例如,在0x80070002中,您需要使用0x0002调用FormatMessage。
但是,它并不总是适用于任何类型的消息。对于某些特定的消息(特定于技术,供应商等),您需要加载相应的资源DLL,这并不总是一件容易的事情,因为您需要查找此DLL。
0x8007中的7是FACILITY_WIN32,它不是FACILITY_ITF。例如,请参阅http://msdn.microsoft.com/en-us/library/ms690088 –
@uvts_cvs - 当然“COM错误代码的结构”。我的错。我已经更新了答案。 –
'HRESULT_CODE(hr)'可以将其转化为win32错误代码 – Andy
下面是使用的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()
函数中的catch子句的要点是什么? –
我不知道FormatMessage引发... – Andy
标题是不同的,但本质上的答案将是相同的,作为[此](http://stackoverflow.com/questions/455434/how-should -i-use-formatmessage-in-c)一个。 –