




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(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ò)誤處理必不可少,而且通常要占用很大的篇幅。本回書(shū)著落在 COM 中的錯(cuò)誤(異常)的處理方法。在組件程序中,如果遇到錯(cuò)誤,一般有兩個(gè)方式進(jìn)行處理。二、簡(jiǎn)單返回對(duì)于比較簡(jiǎn)單的錯(cuò)誤,直接返回表示錯(cuò)誤原因的 HRESULT。比如下面幾個(gè)就是常見(jiàn)的錯(cuò)誤值: E_INVALIDARG0x80070057參數(shù)錯(cuò)誤E_OUTOFMEMORY0x8007000E內(nèi)存錯(cuò)誤E_NOTIMPL0x80004001未實(shí)現(xiàn)E_POINTER0x80004003無(wú)效指針E_HANDLE0x80070006無(wú)效句柄E_ABORT0x8000
2、4004終止操作E_ACCESSDENIED0x80070005拒絕訪問(wèn)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( 來(lái)取得sev錯(cuò)誤程度、fac設(shè)備信息和 code 錯(cuò)誤代碼。三、錯(cuò)誤信息接口既然 COM 是靠各種各樣的接口來(lái)提供服務(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;上面是原理性代碼,在我們寫(xiě)的程序中,不用這么麻煩。因?yàn)?ATL 已經(jīng)把上述的代碼給我們包裝成 CComCoClass:Error( 的6個(gè)重載函數(shù)了。如此,我們可以非常簡(jiǎn)單的改寫(xiě)為: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”,解決方法是手工加上編譯開(kāi)關(guān):圖一、加上編譯開(kāi)關(guān),支持C+的異常處理結(jié)構(gòu)在 2003 中,編譯器默認(rèn)是支持異常處理結(jié)構(gòu)的,所以不用特別進(jìn)行設(shè)置。如果想減小目標(biāo)文件的尺寸,你也可以決定不使用 C+ 異常處理,那么在項(xiàng)目屬性中圖二、在中修改是否支持C+異常結(jié)構(gòu)的編譯開(kāi)關(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ù)取得其它信息六、編寫(xiě)支持錯(cuò)誤處理
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 人員返聘方案(3篇)
- 外出考察工程方案簡(jiǎn)單(3篇)
- 小組崗位人員管理制度
- 園林公司相關(guān)管理制度
- DB6505T 204-2025 晚熟哈密瓜精準(zhǔn)灌溉技術(shù)規(guī)程
- 水塘整治改造方案(3篇)
- 農(nóng)墾小鎮(zhèn)建設(shè)方案(3篇)
- 大棚火災(zāi)調(diào)查方案(3篇)
- 園區(qū)道路升級(jí)改造方案(3篇)
- 圓女活動(dòng)方案(3篇)
- 食品安全培訓(xùn)記錄內(nèi)容范本
- 2024年湖南省中考英語(yǔ)真題卷及答案解析
- XX市慈善會(huì)定向捐贈(zèng)三方協(xié)議書(shū)
- 2024年廣西高考物理試卷(含答案解析)
- 大型機(jī)械運(yùn)輸服務(wù)方案
- 汽修廠安全生產(chǎn)標(biāo)準(zhǔn)化管理體系全套資料匯編(2019-2020新標(biāo)準(zhǔn)實(shí)施模板)
- 《少年有夢(mèng)》大單元教學(xué)設(shè)計(jì)
- 福建省南平市2025屆高三化學(xué)第三次綜合質(zhì)量檢測(cè)試題含解析
- 中國(guó)空氣質(zhì)量改善的健康效應(yīng)評(píng)估
- 江蘇省鹽城市道德與法治中考2025年仿真試卷及答案指導(dǎo)
- 2024年江蘇南通蘇北七市高三三模高考數(shù)學(xué)試卷試題(含答案詳解)
評(píng)論
0/150
提交評(píng)論