博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.NET Interop: 从IErrorInfo错误对象获得托管代码的异常信息
阅读量:4188 次
发布时间:2019-05-26

本文共 1253 字,大约阅读时间需要 4 分钟。

当调用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接口来获得托管的异常信息。_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->Invoke(…, &excepInfo);

 

if( hr == DISP_E_EXCEPTION )

{

      IErrorInfoPtr pErrorInfo;

      :GetErrorInfo(0, &pErrorInfo);

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

      // 获得错误对象的_Exception接口

      _ExceptionPtr pException = pErrorInfo;

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

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

      _bstr_t bstrString;

      pException->get_ToString(bstrString.GetAddress());

}

 

 

作者:      ATField

Blog:     
转载请注明出处

 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1569701

你可能感兴趣的文章
android——学生信息显示和添加
查看>>
Android——ImageSwitcher轮流显示动画
查看>>
Android——利用手机端的文件存储和SQLite实现一个拍照图片管理系统
查看>>
图像调优1:清晰度相关参数MTF,SFR,MTF50,MTF50P 以及TVL的概念以及换算说明
查看>>
图像调优3: CCM参数的标定
查看>>
ctags在verilog代码浏览中的应用
查看>>
NeoVintageous 在sublime中的使用
查看>>
用ncverilog跑仿真时,如何去除对特定路径的timing检查
查看>>
在ncverilog仿真条件设置中+nospecify ,+notimingcheck 和 +delay_mode_zero之间有什么区别
查看>>
linux下nerdtree安装方法
查看>>
最长回文子串(Go,LeetCode)
查看>>
windows下TortoiseGit安装和使用的图文教程
查看>>
基于Jquery的(可视区域,向上滚动向下滚动两种)图片懒加载
查看>>
原生JS的(可视区域,向上滚动向下滚动两种)图片懒加载
查看>>
使用VMware搭建Hadoop集群虚拟网络配置
查看>>
解决vmware下拷贝主机后不识别eth0网卡
查看>>
Promise简单实践
查看>>
vue中无缝轮播简单实现
查看>>
ES5和ES6中的类定义区别
查看>>
利用解构赋值快速提取对象参数
查看>>