`
happmaoo
  • 浏览: 4429593 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多
<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/46860.html" frameborder="0" width="468" scrolling="no" height="60"></iframe>

当调用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:
http://blog.csdn.net/atfield
转载请注明出处



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


分享到:
评论

相关推荐

    《精通.NET互操作:pinvoke, c++ interop和COM interop》全部源代码

    C++ Interop,也称为CLI(Common Language Infrastructure)C++,是.NET框架的一部分,允许C++代码直接与.NET对象交互。它支持两种模式:Managed C++和C++/CLI。Managed C++保留了一些C++的原始语法,同时引入了...

    《精通.NET互操作:p/invoke, c++ interop和COM interop》源代码

    《精通.NET互操作:p/invoke, c++ interop和COM interop》这本书深入探讨了.NET框架中的三种主要互操作技术,即平台调用(P/Invoke)、C++互操作(C++ Interop,也称为StructLayoutAttribute)以及组件对象模型...

    精通.Net互操作配套源码光盘、工具

    《精通.NET互操作P/Invoke,C++Interop和COM Interop... (展开全部) 《精通.NET互操作P/Invoke,C++Interop和COM Interop》介绍Windows平台上的托管代码与非托管代码之间进行互操作的各种技术,包括由.NET提供的各种互...

    精通.NET互操作PInvoke,C++ Interop和COM Interop

    C++ Interop提供了更灵活的互操作方式,可以直接访问.NET对象并创建自己的托管类型。在`Resources`中可能有介绍C++ Interop的文档,而`Source_Code`可能会包含C++/CLI的示例代码。 3. **COM Interop** COM...

    cpp_net_interop:从非托管 C++ 应用程序访问托管 .NET 程序集,示例

    从非托管C++应用程序访问托管.NET程序集,主要依赖于.NET Interop技术,特别是P/Invoke。通过定义函数指针、加载.NET运行时并调用托管方法,可以实现两者之间的通信。这个过程涉及C++的动态链接、.NET运行时的启动...

    Autodesk AutoCAD .Net Interop-开源

    2. **事件处理**:.Net Interop支持事件驱动编程,这意味着你可以编写代码响应AutoCAD中的特定事件,例如用户选择对象、绘制或修改图形时。 3. **命令扩展**:你可以创建自己的AutoCAD命令,这些命令可以像内置的...

    VB.NET 调用Interop.WMPLib.dll实现音乐播放器功能.rar

    这款音乐播放器基于VB.NET编写,实现了以下功能:播放位置随着滑块的拖动而实时变化,是否静音播放的功能,把跟踪条值赋给MediaPlayer1控件的音量设置值,播放或暂停的功能,打开要播放的媒体文件的功能,实时(每隔...

    李维《Dephi.NET托管与非托管代码》

    《Delphi.NET 托管与非托管代码》是由知名IT专家李维撰写的一本书,主要探讨了.NET框架下的编程模型,特别是如何在托管代码和非托管代码之间进行交互。这本书对于理解.NET平台的核心机制和跨语言互操作性具有重要的...

    Essential.NET.Volume.1.The.Common.Language.Runtime

    3. **托管代码与非托管代码**:在.NET中,通过CLR执行的代码称为“托管代码”,它享有内存管理和异常处理的优势。而“非托管代码”通常指的是C++的原生代码,不受到CLR的管理。 4. **垃圾回收(Garbage Collection)*...

    mfc应用程序在.net框架下的扩展

    3. 错误处理:处理.NET异常和MFC错误机制之间的差异,确保程序的健壮性。 4. 学习曲线:掌握.NET和MFC的结合使用可能需要额外的学习和实践。 四、案例分析 一个常见的场景是在MFC GUI应用程序中集成.NET的图形或...

    SAP Business One .Net编程组件 Interop.SAPbobsCOM

    `Interop.SAPbobsCOM`提供了异常处理机制,帮助开发者捕获和处理这些错误。 7. **性能优化**:由于COM与.NET之间的互操作可能影响性能,开发者需要关注如何有效地使用缓存、减少不必要的数据库查询以及合理安排多...

    《精通.NET互操作:P/Invoke,C++ Interop和COM Interop》第四部分

    《精通.NET互操作:P/Invoke,C++ Interop和COM Interop》 因为此书太大,所以分为7部分下载;每部分可单独使用,为RAR压缩文件解压后为PDF版。因为第二部分和第六部分太大以后有权限了上传。 共分为:七部分 当前是:...

    Pkcs11Interop:非托管PKCS#11库的托管.NET包装器

    Pkcs11Interop 非托管PKCS#11库的托管.NET包装器目录概述PKCS#11是由OASIS PKCS 11技术委员会(最初由RSA Laboratories发布)维护的加密标准,该标准定义了ANSI C API来访问智能卡和其他类型的加密硬件。...

    .Net 封送处理(Interop 封送拆收器)

    .NET 封送处理,也称为 Interop Marshaling,是.NET Framework提供的一种机制,用于在托管代码(由.NET runtime管理的代码)和非托管代码(如C++或原生DLL)之间传输数据。这个过程涉及到数据在公共语言运行库堆和非...

    精通.NET互操作

    精通.NET互操作P/Invoke,C++Interop和COM Interop》介绍Windows平台上的托管代码与非托管代码之间进行互操作的各种技术,包括由.NET提供的各种互操作方法、属性以及各种工具的用法及其工作原理。《精通.NET互操作P/...

    Pkcs11Interop:非托管PKCS#11库的托管.NET包装器-开源

    **Pkcs11Interop** 是一个专为.NET Framework设计的开源库,它的主要目标是为非托管的PKCS#11接口提供一个托管的包装器。PKCS#11是RSA安全公司制定的一套标准接口,它允许应用程序与各种密码硬件模块(如智能卡、...

    Visual C++ .NET托管扩展编程

     对Microsoft Visual C++语言进行扩展可以生成.NET代码,这些扩展称为C++.NET托管扩展。C++是惟一一种可以在同一个源文件中混合.NET代码和非托管代码的语言,是真正的.NET系统语言。 本书内容根据开发过程...

Global site tag (gtag.js) - Google Analytics