COM异常处理实现方法总结

来源:互联网 发布:极速网络下载 编辑:程序博客网 时间:2024/06/06 14:47

一、服务器端的实现

  COM 是靠各种各样的接口来提供服务的,ISupportErrorInfo接口能够提供更丰富的错误信息报告。下面这段代码是使用 ISupportErrorInfo 的一般方法:

STDMETHODIMP Cxxx::fun(){... ... ... ...CComQIPtr< ICreateErrorInfo> spCEI;::CreateErrorInfo( &spCEI );spCEI->SetGUID( IID_Ixxx );// 发生错误的接口IIDspCEI->SetSource( L"xxx.xxx" );// ProgID// 如果你的组件同时提供了帮助文件,那么就可以:spCEI->SetHelpContext( 0 );// 设置帮助文件的主题号spCEI->SetHelpFile( L"xxx.hlp" );// 设置帮助文件的文件名spCEI->SetDescription( L"错误描述信息" );CComQIPtr < IErrorInfo > spErrInfo = spCEI;if( spErrInfo )  ::SetErrorInfo( 0, spErrInfo );// 这时调用者就可以得到错误信息了return E_FAIL;}

  上面是原理性代码,在我们实际开发程序中,我们可以非常简单的改写为:

STDMETHODIMP Cxxx::fun(){... ... ... ...return Error( L"错误描述信息" ); //调用CComCoClass::Error函数}
二、客户端接收组件的错误信息
  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 ) ){// 支持,太好了。取出错误信息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 函数取得其它信息}
 
原创粉丝点击