ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

通过C#的COM互操作提高正VB样式错误代码

2019-10-27 22:08:07  阅读:210  来源: 互联网

标签:error-handling com-interop vb6 c net


我有一个在VB6中创建的基础库,该基础库公开了在许多应用程序中使用的标准COM接口.
这也暴露了许多错误代码常量,与Err.Raise一起使用以指示某些条件.

Public Enum IOErrors
  IOErrorBase = 45000
  IOErrorConnectionFailed
  IOErrorAuthFailed
  IOErrorNotConnected
  IOErrorInvalidPortDirection
  IOErrorGettingValue
  IOErrorNoValueYet
End Enum

来吧10年了,我们正在创建实现同一组接口的C#对象,并希望通过调用应用程序可以识别它们的方式引发异常.

我只能找到两个相关的类Win32Exception和COMException.

抛出Win32Exception((int)IOErrors.IOErrorConnectionFailed,“连接失败”)可以正确传递消息,但错误代码将被忽略,Err.Number为& H80004005.

抛出COMException(“ Connect failed”,IOErrors.IOErrorConnectionFailed)不会导致在调用应用程序中拾取任何错误,大概是因为错误代码不是HRESULT且为正,表示成功.

TL; DR
如何从C#引发异常,以使COM互操作将其转换为上面公认的(正)错误代码之一?

解决方法:

VB样式错误的“正数”将转换为严重性为“ FAILURE”且功能为FACILITY_CONTROL / 0xA(即0x800AAFC9)的HRESULT.

您可以使用以下方法获得合适的HRESULT:

int HResult = (int)(0x800A0000 | (int)errorCode);

然后可以使用普通的COMException或通过抛出自己的COMException子类将其引发回调用过程:

/// <summary>
/// Exception that returns an ICIO error wrapped in an exception.
/// </summary>
internal class ICIOErrorException : COMException {
    internal ICIOErrorException(ICIO.IOErrors errorCode, string message)
        : base(message) {
        this.HResult = (int)(0x800A0000 | (int)errorCode);
    }
}

标签:error-handling,com-interop,vb6,c,net
来源: https://codeday.me/bug/20191027/1947598.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有