IntPtr与COM中的任何组件

IntPtr与COM中的任何组件,com,intptr,any,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将它们视为“任意” 这种方法的问题是,我无法使用“任何”类型参数进行更简单的指针数学运算 如果我将PTRTYPE声明

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

我的问题是指针。请参阅我的.IDL的一部分

HRESULT Copy([in] PTRTYPE destAddr, [in] PTRTYPE srcAddr, [in] int bytes); 
如果我将PTRTYPE声明为void*,c#将它们视为IntPtr,而VB6/VBScript将它们视为“任意”

这种方法的问题是,我无法使用“任何”类型参数进行更简单的指针数学运算

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

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

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

提前感谢,,
Mauro.

我建议不要强迫您类型的使用者进行指针计算

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


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

我采用的解决方案如下:

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

2) 在要成为IntPtr的变量中,将_int3264替换为void*

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

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

问候,,
毛罗。

你好,里德。真正的函数是ReadProcessMemory的包装器。几乎可以肯定消费者需要做一些数学运算。@Calamardo您可以提供“允许的”数学运算作为重载/方法,并避免此问题。您即将犯触发ADO_LONGPTR崩溃的相同错误。只需提供一个Copy64()方法或一个IAddress接口。