2011-08-10 62 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

相關問題