COM中的IntPtr与As Any

时间:2012-02-17 20:07:38

标签: com intptr any

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

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

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

如果我将PTRTYPE声明为void *,则c#将它们视为IntPtr,VB6 / VBScript将它们视为“As Any”

这种方法的问题在于我无法使用“Any”类型参数进行更简单的指针数学运算。

如果我将PTRTYPE声明为long(以及64位中的“hyper”),现在我可以进行指针数学运算,但在C#中,对于32/64位平台,我对同一方法有两种不同的定义。

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

有没有办法让它与C#和VBScript兼容?

提前致谢, 莫罗。

2 个答案:

答案 0 :(得分:0)

我建议不要强迫你的类型的消费者做指针数学。

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

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

答案 1 :(得分:0)

我采用的解决方案如下:

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

2)在想要为IntPtr

的变量中将__int3264替换为void *

3)从.idl文件构建.tlb文件

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

瞧!

此致 莫罗。