当调用IDispatch::Invoke函数的时候,当函数调用过程中抛出了异常,Invoke函数会返回DISP_E_EXCEPTION,代表异常发生。Invoke函数的pExceptionInfo参数可以提供关于异常的有关信息:
| IDispatch *pDisp; EXCEPINFO excepInfo; HRESULT hr = pDisp->Invoke(…, &excepInfo);
if( hr == DISP_E_EXCEPTION ) { // 使用excepInfo获得异常信息 } |
当pDisp指向一个托管对象(Managed Object)的时候,excepInfo并不能提供足够的信息。这个时候我们可以使用IErrorInfo和_Exception接口来获得托管的异常信息。_Exception是mscorlib.dll提供的对托管异常的支持的接口(mscorlib.dll同时还有大量的接口可以供Interop的时候使用),可以通过#import来导入mscorlib.dll中的COM接口:
| // 导入.NET Framework 2.0版本中的mscorlib.dll的Type Library #import "C:/Windows/Microsoft.NET/Framework/v2.0.50727/mscorlib.tlb" no_namespace named_guids raw_interfaces_only |
之后,当Invoke返回DISP_E_EXCEPTION的时候,调用::GetErrorInfo函数获得IErrorInfo对象:
| IDispatch *pDisp; EXCEPINFO excepInfo; HRESULT hr = pDisp->Invoke(…, &excepInfo);
if( hr == DISP_E_EXCEPTION ) { IErrorInfoPtr pErrorInfo; :GetErrorInfo(0, &pErrorInfo); |
IErrorInfo所指向的错误对象当抛出托管异常的时候,将会支持_Exception接口,这个接口可以通过一个QueryInterface获得。通过智能指针,只需简单做一个赋值即可。
| // 获得错误对象的_Exception接口 |
之后,便可以使用_Exception接口所支持的各种方法来获得托管异常的有关信息了,比如:
| // 将_Exception转换成字符串,用于显示 _bstr_t bstrString; } |
作者: ATField
Blog: http://blog.youkuaiyun.com/atfield
转载请注明出处
本文介绍如何处理IDispatch::Invoke函数中抛出的异常,包括如何获取异常信息及使用IErrorInfo和_Exception接口获取托管异常详情。
1万+

被折叠的 条评论
为什么被折叠?



