1

我正在开发一个应该在 C# 和 VBScript 中工作的 COM 对象。它还必须支持 32 位和 64 位。

我遇到的问题是指针。查看我的 .IDL 的一部分

HRESULT Copy([in] PTRTYPE destAddr, [in] PTRTYPE srcAddr, [in] int bytes); 

如果我将 PTRTYPE 声明为 void*,c# 将它们视为 IntPtr,而 VB6/VBScript 将它们视为“任意”

这种方法的问题是我不能用“任何”类型参数做更简单的指针数学。

如果我将 PTRTYPE 声明为 long(并且在 64 位中声明为“超​​”),那么现在我可以进行指针数学运算,但在 C# 中,我对同一方法有两个不同的定义,具体取决于 32/64 位平台。

我希望避免使用 VARIANT 作为 PTRTYPE 类型。

有什么方法可以使它与 C# 和 VBScript 兼容?

在此先感谢,毛罗。

4

2 回答 2

0

我建议不要强迫您类型的消费者进行指针数学运算。

如果将其声明为 void,您始终可以允许将偏移量作为参数传递,而不是强制消费者进行操作。这可能看起来有点像.NET 框架中的Array.Copy重载,其中源 + 目标有一个作为简单整数传递的偏移量。

通过这样做,无论您选择什么消费者,您都可以让该方法正常工作,并为您提供一种在您自己的代码中进行验证(即:确保偏移量是合法的)的方法,而不是依赖消费者。

于 2012-02-17T20:10:47.343 回答
0

我采用的解决方案如下:

1) 将 .idl 复制到另一个文件夹

2)在你想成为 IntPtr 的变量中用 void* 替换 __int3264

3)从 .idl 构建 .tlb 文件

4) 基于 .tlb 文件构建主互操作。

瞧!

问候,毛罗。

于 2012-03-15T15:40:51.430 回答