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)一個。 –