<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接口来获得托管的异常信息。_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接口 _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
分享到:
相关推荐
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++互操作(C++ Interop,也称为StructLayoutAttribute)以及组件对象模型...
《精通.NET互操作P/Invoke,C++Interop和COM Interop... (展开全部) 《精通.NET互操作P/Invoke,C++Interop和COM Interop》介绍Windows平台上的托管代码与非托管代码之间进行互操作的各种技术,包括由.NET提供的各种互...
C++ Interop提供了更灵活的互操作方式,可以直接访问.NET对象并创建自己的托管类型。在`Resources`中可能有介绍C++ Interop的文档,而`Source_Code`可能会包含C++/CLI的示例代码。 3. **COM Interop** COM...
从非托管C++应用程序访问托管.NET程序集,主要依赖于.NET Interop技术,特别是P/Invoke。通过定义函数指针、加载.NET运行时并调用托管方法,可以实现两者之间的通信。这个过程涉及C++的动态链接、.NET运行时的启动...
2. **事件处理**:.Net Interop支持事件驱动编程,这意味着你可以编写代码响应AutoCAD中的特定事件,例如用户选择对象、绘制或修改图形时。 3. **命令扩展**:你可以创建自己的AutoCAD命令,这些命令可以像内置的...
这款音乐播放器基于VB.NET编写,实现了以下功能:播放位置随着滑块的拖动而实时变化,是否静音播放的功能,把跟踪条值赋给MediaPlayer1控件的音量设置值,播放或暂停的功能,打开要播放的媒体文件的功能,实时(每隔...
《Delphi.NET 托管与非托管代码》是由知名IT专家李维撰写的一本书,主要探讨了.NET框架下的编程模型,特别是如何在托管代码和非托管代码之间进行交互。这本书对于理解.NET平台的核心机制和跨语言互操作性具有重要的...
3. **托管代码与非托管代码**:在.NET中,通过CLR执行的代码称为“托管代码”,它享有内存管理和异常处理的优势。而“非托管代码”通常指的是C++的原生代码,不受到CLR的管理。 4. **垃圾回收(Garbage Collection)*...
3. 错误处理:处理.NET异常和MFC错误机制之间的差异,确保程序的健壮性。 4. 学习曲线:掌握.NET和MFC的结合使用可能需要额外的学习和实践。 四、案例分析 一个常见的场景是在MFC GUI应用程序中集成.NET的图形或...
`Interop.SAPbobsCOM`提供了异常处理机制,帮助开发者捕获和处理这些错误。 7. **性能优化**:由于COM与.NET之间的互操作可能影响性能,开发者需要关注如何有效地使用缓存、减少不必要的数据库查询以及合理安排多...
《精通.NET互操作:P/Invoke,C++ Interop和COM Interop》 因为此书太大,所以分为7部分下载;每部分可单独使用,为RAR压缩文件解压后为PDF版。因为第二部分和第六部分太大以后有权限了上传。 共分为:七部分 当前是:...
Pkcs11Interop 非托管PKCS#11库的托管.NET包装器目录概述PKCS#11是由OASIS PKCS 11技术委员会(最初由RSA Laboratories发布)维护的加密标准,该标准定义了ANSI C API来访问智能卡和其他类型的加密硬件。...
.NET 封送处理,也称为 Interop Marshaling,是.NET Framework提供的一种机制,用于在托管代码(由.NET runtime管理的代码)和非托管代码(如C++或原生DLL)之间传输数据。这个过程涉及到数据在公共语言运行库堆和非...
精通.NET互操作P/Invoke,C++Interop和COM Interop》介绍Windows平台上的托管代码与非托管代码之间进行互操作的各种技术,包括由.NET提供的各种互操作方法、属性以及各种工具的用法及其工作原理。《精通.NET互操作P/...
**Pkcs11Interop** 是一个专为.NET Framework设计的开源库,它的主要目标是为非托管的PKCS#11接口提供一个托管的包装器。PKCS#11是RSA安全公司制定的一套标准接口,它允许应用程序与各种密码硬件模块(如智能卡、...
对Microsoft Visual C++语言进行扩展可以生成.NET代码,这些扩展称为C++.NET托管扩展。C++是惟一一种可以在同一个源文件中混合.NET代码和非托管代码的语言,是真正的.NET系统语言。 本书内容根据开发过程...