COM 組件設計與應用(12)―錯誤與異常處理_第1頁
COM 組件設計與應用(12)―錯誤與異常處理_第2頁
COM 組件設計與應用(12)―錯誤與異常處理_第3頁
COM 組件設計與應用(12)―錯誤與異常處理_第4頁
COM 組件設計與應用(12)―錯誤與異常處理_第5頁
已閱讀5頁,還剩3頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、COM組件設計與應用(十二)錯誤與異常處理作者:楊老師下載源代碼一、前言程序設計中,錯誤處理必不可少,而且通常要占用很大的篇幅。本回書著落在 COM 中的錯誤(異常)的處理方法。在組件程序中,如果遇到錯誤,一般有兩個方式進行處理。二、簡單返回對于比較簡單的錯誤,直接返回表示錯誤原因的 HRESULT。比如下面幾個就是常見的錯誤值: E_INVALIDARG0x80070057參數錯誤E_OUTOFMEMORY0x8007000E內存錯誤E_NOTIMPL0x80004001未實現E_POINTER0x80004003無效指針E_HANDLE0x80070006無效句柄E_ABORT0x8000

2、4004終止操作E_ACCESSDENIED0x80070005拒絕訪問E_NOINTERFACE0x80004002不支持接口另外,你還可以返回自己構造 HRESULT 錯誤值。方法是使用宏 MAKE_HRESULT(sev,fac,code 參數含義值(二進制)sev 嚴重程度成功00成功,但有一些報告信息01警告10錯誤11fac 設備信息FACILITY_AAF00000010010FACILITY_ACS00000010100FACILITY_BACKGROUNDCOPY00000100000FACILITY_CERT00000001011FACILITY_COMPLUS000000

3、10001FACILITY_CONFIGURATION00000100001FACILITY_CONTROL00000001010FACILITY_DISPATCH00000000010FACILITY_DPLAY00000010101FACILITY_HTTP00000011001FACILITY_INTERNET00000001100FACILITY_ITF00000000100FACILITY_MEDIASERVER00000001101FACILITY_MSMQ00000001110FACILITY_NULL00000000000FACILITY_RPC00000000001FACIL

4、ITY_SCARD00000010000FACILITY_SECURITY00000001001FACILITY_SETUPAPI00000001111FACILITY_SSPI00000001001FACILITY_STORAGE00000000011FACILITY_SXS00000010111FACILITY_UMI00000010110FACILITY_URT00000010011FACILITY_WIN3200000000111FACILITY_WINDOWS00000001000FACILITY_WINDOWS_CE00000011000code 唯一錯誤碼16位(bit 你自己定

5、義去吧調用者得到返回的 HRESULT 值后,也可以使用宏 HRESULT_SEVERITY(、HRESULT_FACILITY(、HRESULT_CODE( 來取得sev錯誤程度、fac設備信息和 code 錯誤代碼。三、錯誤信息接口既然 COM 是靠各種各樣的接口來提供服務的,于是很自然地就會想到,是否有一個接口能夠提供更豐富的錯誤信息報告那?答案是:ISupportErrorInfo。下面這段代碼是使用 ISupportErrorInfo 的一般方法:STDMETHODIMP Cxxx:fun(. . . .CComQIPtr< ICreateErrorInfo> spCEI

6、;:CreateErrorInfo( &spCEI ;spCEI->SetGUID( IID_Ixxx ; / 發生錯誤的接口IIDspCEI->SetSource( L"xxx.xxx" ; / ProgID/ 如果你的組件同時提供了幫助文件,那么就可以:spCEI->SetHelpContext( 0 ; / 設置幫助文件的主題號spCEI->SetHelpFile( L"xxx.hlp" ; / 設置幫助文件的文件名spCEI->SetDescription( L"錯誤描述信息" ;CCom

7、QIPtr < IErrorInfo > spErrInfo = spCEI;if( spErrInfo :SetErrorInfo( 0, spErrInfo ; / 這時調用者就可以得到錯誤信息了return E_FAIL;上面是原理性代碼,在我們寫的程序中,不用這么麻煩。因為 ATL 已經把上述的代碼給我們包裝成 CComCoClass:Error( 的6個重載函數了。如此,我們可以非常簡單的改寫為:STDMETHODIMP Cxxx:fun(. . . .return Error( L"錯誤描述信息" ;四、關于 try/catch學習了 C+ 后,很多

8、人都喜歡使用 try/catch 的異常處理結構。如果你使用 vc6.0 的ATL,編譯器默認是不支持異常處理的,編譯后會報告“warning C4530: C+ exception handler used, but unwind semantics are not enabled. Specify -GX”,解決方法是手工加上編譯開關:圖一、加上編譯開關,支持C+的異常處理結構在 2003 中,編譯器默認是支持異常處理結構的,所以不用特別進行設置。如果想減小目標文件的尺寸,你也可以決定不使用 C+ 異常處理,那么在項目屬性中圖二、在中修改是否支持C+異常結構的編譯開關五、客戶端接收組件的錯

9、誤信息1、如果使用 API 方式調用組件,接收錯誤的方法是:HRESULT hr = spXXX->fun( / 調用組件功能if( FAILED( hr / 如果發生了錯誤CComQIPtr < ISupportErrorInfo > spSEI = spXXX; / 組件是否提供了 ISupportErrorInfo 接口?if( spSEI / 如果支持,那么hr = spSEI->InterfaceSupportsErrorInfo( IID_Ixxx ; / 是否支持 Ixxx 接口的錯誤處理?if( SUCCEEDED( hr / 支持,太好了。取出錯誤信息

10、CComQIPtr < IErrorInfo > spErrInfo; / 聲明 IErrorInfo 接口hr = :GetErrorInfo( 0, &spErrInfo ; / 取得接口if( SUCCEEDED( hr CComBSTR bstrDes;spErrInfo->GetDescription( &bstrDes ; / 取得錯誤描述. / 還可以取得其它的信息2、如果使用 #import 等包裝方式調用組件,接收錯誤的方法是:try. / 調用組件功能catch( _com_error &e e.Description(; / 取得錯誤描述信息. / 還可以調用 _com_error 函數取得其它信息六、編寫支持錯誤處理

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論