2011-02-05 35 views
3

我正在調用返回HRESULTS的WMI/WBEM接口上的方法。我想爲這些錯誤代碼向用戶顯示有意義的錯誤消息。但是,當我查看HRESULT的錯誤消息時,我只能得到類似「IDispatch error#3598」的字符串。IDispatch錯誤和/或消息文本列表

我能找到這些IDispatch錯誤代碼的列表來解釋它們的含義嗎?

示例代碼可能出現錯誤:

IWbemLocator *pLocator = NULL; 
IWbemServices *pNamespace = NULL; 
hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLocator); 
if (FAILED(hr)) 
    return hr; 

hr = pLocator->ConnectServer(wPath, NULL, NULL, NULL, 0, NULL, NULL, &pNamespace); 
if(FAILED(hr)) 
    return hr; 

錯誤查找:

CString sMessage = _com_error(nError).ErrorMessage(); 

// sMessage now contains a string like "IDispatch error #3598" 

注:This沒有幫助 - 它不包含我得到的HRESULTS。它們也不包含在winerror.h中。

回答

6

COM服務器可以生成自己的HRESULT錯誤代碼。 IErrorInfo接口幫助客戶獲得錯誤的描述。您沒有給_com_error類做這個工作的機會,您不會將IErrorInfo接口指針傳遞給構造函數。

首先QI ISupportErrorInfo的接口並調用其InterfaceSupportsErrorInfo()方法來驗證是否支持錯誤報告。接下來調用GetErrorInfo()來獲取IErrorInfo接口指針。 MSDN文檔are here

+0

Hans,這聽起來合乎邏輯 - 然而,我嘗試了以下方法,並且因爲QueryInterface調用而只得到E_NOINTERFACE: hr = pLocator-> ConnectServer(wPath,NULL,NULL,NULL,0,NULL,NULL ,&pNamespace);如果(失敗(hr)) { \t HRESULT result = pLocator-> QueryInterface(IID_IErrorInfo,(void **)&pErrorInfo); \t if(SUCCEEDED(result)&& pErrorInfo!= NULL) \t \t CString sMessage = _com_error(hr,pErrorInfo).ErrorMessage(); – 2011-02-05 21:28:11