2011-08-10 32 views
39

win API中是否有函数可用于提取HRESULT值的字符串表示形式?有没有办法使用win API获取HRESULT值的字符串表示?

问题是,并非所有的返回值都记录在MSDN中,例如ExecuteInDefaultAppDomain()函数没有记录为返回“0x80070002 - 系统找不到指定的文件”,但是,它的确如此!因此,我想知道是否有一种常用的功能。

+2

标题是不同的,但本质上的答案将是相同的,作为[此](http://stackoverflow.com/questions/455434/how-should -i-use-formatmessage-in-c)一个。 –

回答

62

您可以使用_com_error

_com_error err(hr); 
LPCTSTR errMsg = err.ErrorMessage(); 

如果你不想使用_com_error不管什么原因,你仍然可以看看它的来源,看看它是如何做。

不要忘了包括头comdef.h

+4

为了方便起见,更完整的示例: inline CString GetMessageForHresult(HRESULT hr) { _com_error error(hr); CString cs;cs.Format(_T(“Error 0x%08x:%s”),hr,error.ErrorMessage()); return cs; } – nietras

+1

需要头文件:#include

12

这个在Windows API是FormatMessage。这里是一个链接,说明如何做到这一点:How to obtain error message descriptions using the FormatMessage API

对于Win32消息(HRESULT以0x8007开头的消息,即FACILITY_WIN32),您需要删除hi命令字。例如,在0x80070002中,您需要使用0x0002调用FormatMessage。

但是,它并不总是适用于任何类型的消息。对于某些特定的消息(特定于技术,供应商等),您需要加载相应的资源DLL,这并不总是一件容易的事情,因为您需要查找此DLL。

+0

0x8007中的7是FACILITY_WIN32,它不是FACILITY_ITF。例如,请参阅http://msdn.microsoft.com/en-us/library/ms690088 –

+0

@uvts_cvs - 当然“COM错误代码的结构”。我的错。我已经更新了答案。 –

+0

'HRESULT_CODE(hr)'可以将其转化为win32错误代码 – Andy

-1

下面是使用的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() 
+1

函数中的catch子句的要点是什么? –

+0

我不知道FormatMessage引发... – Andy

相关问题