版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 初中語文文言文復(fù)習(xí)課件
- 贛南衛(wèi)生健康職業(yè)學(xué)院《cinema4d》2023-2024學(xué)年第一學(xué)期期末試卷
- 贛東學(xué)院《物流學(xué)基礎(chǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2022年三月公務(wù)員考試公共基礎(chǔ)知識(shí)沖刺測(cè)試題
- 七年級(jí)生物上冊(cè)第三單元生物圈中的綠色植物第二章被子植物的一生第一節(jié)種子的萌發(fā)教案新版新人教版
- 《雨后教學(xué)》課件
- 三年級(jí)數(shù)學(xué)上冊(cè)一動(dòng)物趣聞-克千克噸的認(rèn)識(shí)噸的認(rèn)識(shí)說課稿青島版六三制
- 2024-2025學(xué)年北京市豐臺(tái)區(qū)高三語文上學(xué)期期末試卷及答案解析
- 銀行網(wǎng)點(diǎn)數(shù)據(jù)分析-培訓(xùn)課程
- 境外公共安全課件
- (已壓縮)礦產(chǎn)資源儲(chǔ)量技術(shù)標(biāo)準(zhǔn)解讀300問-1-90
- 《阿爾茨海默病康復(fù)》課件
- 2022-2023學(xué)年福建省泉州市惠安縣三年級(jí)(上)期末數(shù)學(xué)試卷
- 校企聯(lián)合實(shí)驗(yàn)室的運(yùn)營(yíng)與維護(hù)
- 期末綜合試卷(含答案)2024-2025學(xué)年蘇教版數(shù)學(xué)四年級(jí)上冊(cè)
- 統(tǒng)編版語文2024-2025學(xué)年六年級(jí)上冊(cè)語文期末專題訓(xùn)練:字音字形(有答案)
- 機(jī)器人課件模板下載
- 江蘇省蘇州市2023-2024學(xué)年高二上學(xué)期期末學(xué)業(yè)質(zhì)量陽光指標(biāo)調(diào)研試題 物理 含答案
- 2024-2025學(xué)年人教版道法八年級(jí)上冊(cè) 第一學(xué)期期末測(cè)試卷01
- 徐州市2023-2024學(xué)年八年級(jí)上學(xué)期期末地理試卷(含答案解析)
- 人教版數(shù)學(xué)小學(xué)二年級(jí)上冊(cè)無紙筆測(cè)試題
評(píng)論
0/150
提交評(píng)論