gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:24:23 24 4
gpt4 key购买 nike

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

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

10 年过去了,我们正在创建实现同一组接口(interface)的 C# 对象,并希望以调用应用程序能够识别它们的方式抛出异常。

我只能找到两个相关的类,Win32ExceptionCOMException

抛出 Win32Exception((int)IOErrors.IOErrorConnectionFailed, "Connect failed") 正确传递回消息,但错误代码被忽略并且 Err.Number&H80004005.

抛出 COMException("Connect failed", IOErrors.IOErrorConnectionFailed) 导致在调用应用程序中没有发现错误,大概是因为错误代码不是 HRESULT为正,表示成功。

长话短说我怎样才能从 C# 中抛出异常,以便 COM 互操作将其转换为上面识别的(正)错误代码之一?

最佳答案

“正”VB 样式错误号被转换为具有“FAILURE”严重性和设施 FACILITY_CONTROL/0xAHRESULT ,即 0x800AAFC9

您可以使用以下方法获得合适的 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);
}
}

关于c# - 通过 C# 的 COM 互操作提高正 VB 样式错误代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32868307/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com