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

news/2024/6/25 19:44:09

当调用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
转载请注明出处

 



http://www.niftyadmin.cn/n/3658026.html

相关文章

将NWPU VHR-10数据集转换为coco格式

""" Created on 5/11 读取txt文件,划分训练集和测试集并且生成coco格式的json文件 author: Wu """ import json import os import numpy as np import pandas as pd import re import cv2 import shutil from PIL import Image from …

yolov4官方源码在自己的数据集上运行笔记

地址:https://github.com/AlexeyAB/darknet源码是c的不是python的,所以配置稍微有点麻烦: 首先要先配好环境,否则编译会出错,就算编译不出错,运行也会出错,环境要求看官方文档(也就是…

如何知道可执行文件是32-bit还是64-bit

可以使用GetBinaryType API来获得这个信息:BOOL GetBinaryType(LPCTSTR lpApplicationName,LPDWORD lpBinaryType);Binary Type可以是下面的值。ValueMeaningSCS_32BIT_BINARYA 32-bit Windows-based applicationSCS_64BIT_BINARYA 64-bit Windows-based applicatio…

SSD pytorch 运行debug

出于某些原因需要在一个数据集上测试SSD 源代码来自github 高star的repos:https://github.com/amdegroot/ssd.pytorch为了在自己的数据集上进行训练和测试,首先是要按下面这篇blog的流程先修改: https://blog.csdn.net/dingkm666/article/det…

转载:如何指定程序在Vista上面需要提升权限运行(Elevated)

在Manifest中加上下面内容即可:level""asInvoker""uiAccess""false"" />全文请见:http://blogs.msdn.com/shawnfa/archive/2006/04/06/568563.aspx

CornerNet跑自己数据集笔记

原repos地址为:https://github.com/princeton-vl/CornerNet为了在服务器的cuda10电脑上用自己的数据集跑这份代码,主要有三点: 修改数据集接口适应cuda10和pytorch1.5训练配置 接下来就分点详述: 修改数据集接口: 有…

转贴:Mark Russinovich的Inside Vista Kernel系列文章,讲到了Vista内核的调度,IO,内存管理,缓存,事务处理,安全等众多新特性

Mark Russinovich的Inside Vista Kernel系列文章。Mark是SysInternals的创始人之一,是多个著名系统工具的作者,是Windows系统内核方面的高手。不久前他接受了Microsoft的Technical Fellow职位,参与Windows Kernel开发。本文讲到了Vista内核的…

2-6月以来密集的项目实践的总结

2-4月做了三件事,为MICCAI会议投稿论文准备一些实验,打了个超分辨率比赛NTIRE,得了大概是第7名/200多个参赛队伍,做了一个新冠病毒相关肺部图像诊断的项目;4-6月以来做了三件事情,写了一份(实际…