COM的錯誤處理 (轉)

worldblog發表於2007-12-02
COM的錯誤處理 (轉)[@more@]

 COM的錯誤處理
黃森堂(vcmfc)茁著

  本人的文采很差,只能從較實在的角度出發了。

  在這裡我主要提COM的原始處理方法與ATL提供的處理方法,至於MFC,可能也就差不多了。

1.COM的原始處理方式:

  由於COM是與語言的無關性,COM提供了返回碼HRESULT,HRESULT定義為一個簡單的長整形,即一個32位的值,它由3部分組成:用途、嚴重性、狀態碼.提供了一些有用的宏定義來輔助操作,其中MAKE_HRESULT是用來將用途、嚴重性、狀態碼組合成HRRESULT值,其引數請參考MSDN。但由於在高階語句中HRESULT不能很多地工作,因為這些語句將HRESULT值隱藏起來,在這些語句中,錯誤是作為異常而不是返回碼來進行處理。當在這些語句中進行時,它提供的錯誤資訊太少了,為了克服這一陷,COM提供了IErrorInfo,ICreateError和ISupportErrorInof介面,在ATL Wizard的屬性中Attribute的Support ISupportErrorInfo打鉤就可以了,然後在你的中需要返回錯誤資訊的地方加入以下程式碼:
ICreateErrorInfo *pErrorInfo=NULL;
CreateErrorInfo(&pErrorInfo);
pErrorInfo->SetGUID(IID_IEncrypt);//你的的GUID
pErrorInfo->Set(L"Encrypt.Encrypt");
pErrorInfo->SetDescription(A2W((char*)szErrorText));//出錯說明資訊
IErrorInfo *pErrInfo=NULL;
//第一個引數一定是IID_IErrorInfo,不是你的GUID,不亂寫。
pErrorInfo->QueryInterface(IID_IErrorInfo,(void**)&pErrInfo);
SetErrorInfo(0,pErrInfo);
pErrInfo->Release();
pErrorInfo->Release();
//::GetLastError();可換成你的錯誤ID;
return MAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF,::GetLastError());

2.ATL提供的錯誤處理方式:

  ATL可真是簡單之極,它把上面的全包裝起來,就是使用CComCoClass::Error就可以了,如下:
// return Error(A2W((char*)szErrorText),IID_IEncrypt,::GetLastError());

還有問題嗎?嘿嘿~~,本人的得到陸誼edyang的大力幫助及指點的,高手莫笑!。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987432/,如需轉載,請註明出處,否則將追究法律責任。

相關文章