COM 組件設(shè)計(jì)與應(yīng)用(12)―錯(cuò)誤與異常處理_第1頁
COM 組件設(shè)計(jì)與應(yīng)用(12)―錯(cuò)誤與異常處理_第2頁
COM 組件設(shè)計(jì)與應(yīng)用(12)―錯(cuò)誤與異常處理_第3頁
COM 組件設(shè)計(jì)與應(yīng)用(12)―錯(cuò)誤與異常處理_第4頁
COM 組件設(shè)計(jì)與應(yīng)用(12)―錯(cuò)誤與異常處理_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

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

2、4004終止操作E_ACCESSDENIED0x80070005拒絕訪問E_NOINTERFACE0x80004002不支持接口另外,你還可以返回自己構(gòu)造 HRESULT 錯(cuò)誤值。方法是使用宏 MAKE_HRESULT(sev,fac,code 參數(shù)含義值(二進(jìn)制)sev 嚴(yán)重程度成功00成功,但有一些報(bào)告信息01警告10錯(cuò)誤11fac 設(shè)備信息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 唯一錯(cuò)誤碼16位(bit 你自己定

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

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

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

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

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

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論