.NET Interop: 从IErrorInfo错误对象获得托管代码的异常信息

本文介绍当IDispatch::Invoke函数调用出现异常时如何获取详细信息,特别是如何利用IErrorInfo和_Exception接口从托管对象中提取异常详情。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2007年04月18日 21:25:00

当调用IDispatch::Invoke函数的时候,当函数调用过程中抛出了异常,Invoke函数会返回DISP_E_EXCEPTION,代表异常发生。Invoke函数的pExceptionInfo参数可以提供关于异常的有关信息:

IDispatch *pDisp;

EXCEPINFO excepInfo;

HRESULT hr = pDisp-

if( hr == DISP_E_EXCEPTION )

{

// 使用excepInfo获得异常信息

}

pDisp指向一个托管对象(Managed Object)的时候,excepInfo并不能提供足够的信息。这个时候我们可以使用IErrorInfo_Exception接口来获得托管的异常信息。_Exceptionmscorlib.dll提供的对托管异常的支持的接口(mscorlib.dll同时还有大量的接口可以供Interop的时候使用),可以通过#import来导入mscorlib.dll中的COM接口:

// 导入.NET Framework 2.0版本中的mscorlib.dllType 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-

if( hr == DISP_E_EXCEPTION )

{

IErrorInfoPtr pErrorInfo;

:GetErrorInfo(0, &pErrorInfo);

IErrorInfo所指向的错误对象当抛出托管异常的时候,将会支持_Exception接口,这个接口可以通过一个QueryInterface获得。通过智能指针,只需简单做一个赋值即可。

// 获得错误对象的_Exception接口
_ExceptionPtr pException = pErrorInfo;

之后,便可以使用_Exception接口所支持的各种方法来获得托管异常的有关信息了,比如:

// _Exception转换成字符串,用于显示

_bstr_t bstrString;
pException-
);

}

作者: ATField
Blog:
http://blog.youkuaiyun.com/atfield
转载请注明出处



Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=1569701


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值