我正在开发一个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兼容?
提前致谢, 莫罗。
答案 0 :(得分:0)
我建议不要强迫你的类型的消费者做指针数学。
如果将此声明为void,则始终可以允许将偏移作为参数传递,而不是强制使用者进行操作。这看起来有点像.NET框架中的这个Array.Copy重载,其中源+目标的偏移量作为简单整数传递。
通过这样做,无论您选择哪种消费者,您都可以让方法正常工作,并为您提供一种在您自己的代码中进行验证的方法(即:确保偏移是合法的),而不是依赖于消费者。
答案 1 :(得分:0)
我采用的解决方案如下:
1)将.idl复制到另一个文件夹
2)在想要为IntPtr
的变量中将__int3264替换为void *3)从.idl文件构建.tlb文件
4)基于.tlb文件构建主互操作。
瞧!
此致 莫罗。