在C#编写的COM对象中,长整型显示为VB6不支持的变体类型

4

我有一个用C#编写的DLL,我正在将其转换为COM对象以在VB6应用程序中使用。 我定义了几种方法和属性类型为long,但在VB6中访问时会显示为“不支持的变量类型”。后来我注意到,在C#中定义的一个函数如下:

void Load(long firstNumber, int firstCheckDigit, long lastNumber , int lastCheckDigit)

在我的VB6对象浏览器中显示为:

Sub Load(firstNumber As <Unsupported variant type>, firstCheckDigit As Long, lastNumber As <Unsupported variant type>, lastCheckDigit As Long)

显然,这种转换将C#中的int类型转换为VB6中的Long类型,对我来说这不是问题。然而,我需要在C#和VB6中将firstNumberlastNumber变量都设为long。由于输入值的大小,后端变量不能为int。有什么方法可以做到这一点吗?还是DLL侧的long类型与COM对象不兼容?

1
“Int” 在 .NET(32 位)和 VB6(16 位)中有不同的含义。因此,C# 中的 Int 变成了 VB6 的 Long(即 32 位)。在 VB6 中没有 .NET “Long”(64 位)的类似物 - 您真的需要这种精度吗? - Yuriy Galanter
@YuriyGalanter,你应该在回答中提供一些支持性的文档。这样我就会给你点赞了。 - David L
@DavidL,它在这里:)例如http://msdn.microsoft.com/en-us/library/vstudio/06bkb8w2.aspx Interop注意事项。如果要与未为.NET Framework编写的组件进行接口交互,例如自动化或COM对象,请记住,在其他环境中,Integer具有不同的数据宽度(16位)。 如果将16位参数传递给此类组件,请在新的Visual Basic代码中将其声明为Short而不是Integer。那是VB.NET,但是一样的。如果OP想要我会把这个作为答案发布 - Yuriy Galanter
@YuriyGalanter 我确实有这个问题。这些数字是(可能是)10位数,所以我之前遇到过溢出的情况,因为我使用了太大的10位数(超过了约20亿的限制)。 - redgrey85
你能把它们作为字符串传递吗? - Yuriy Galanter
这是我想出来的东西。我希望不必太多地进行逆向工程,但不幸的是,那似乎是解决我的具体问题的方法。发表您的第一条评论和字符串想法作为解决方案,我一定会给您点赞。 - redgrey85
2个回答

6

确实,VB6没有64位整数类型。

你需要使用intdouble进行适配。后者当然不太理想,但可以获得15个数字。


2
我认为CurrencyDECIMAL也可以使用。 - RBarryYoung


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接