COM的錯誤處理 (轉)
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用PHP錯誤處理 (轉)PHP
- 錯誤處理的一點思考 (轉)
- [轉] Scala Try 與錯誤處理
- Windows函式錯誤處理 (轉)Windows函式
- 錯誤處理
- go的錯誤處理Go
- PHP 錯誤處理PHP
- php錯誤處理PHP
- Go 錯誤處理Go
- Swift錯誤處理Swift
- Zabbix錯誤處理
- mysqldump錯誤處理MySql
- axios 的錯誤處理iOS
- ORA-39700 with UPGRADE option錯誤的處理(轉)
- ORA-12516錯誤的處理(轉)
- 錯誤處理:如何通過 error、deferred、panic 等處理錯誤?Error
- PHP錯誤處理和異常處理PHP
- Python錯誤處理Python
- 請教 Element 的錯誤處理
- Restful API 中的錯誤處理RESTAPI
- 【譯】RxJava 中的錯誤處理RxJava
- grpc中的錯誤處理RPC
- JavaScript的錯誤簡易處理JavaScript
- 【故障處理】ORA-12162 錯誤的處理
- 前端的水平線,錯誤處理和除錯前端除錯
- 轉載ORA-01591錯誤故障處理
- 異常錯誤資訊處理
- PHP 核心特性 - 錯誤處理PHP
- 常用模組 PHP 錯誤處理PHP
- laravel9 錯誤處理Laravel
- 淺談前端錯誤處理前端
- Oracle異常錯誤處理Oracle
- ORACLE 異常錯誤處理Oracle
- 15-錯誤處理(Error)Error
- 學習Rust 錯誤處理Rust
- Go語言之錯誤處理Go
- GOLANG錯誤處理最佳方案Golang
- Objective-C:錯誤處理Object