如何将 void 指针(又名void*
或句柄)放入 COM VARIANT
-Type。包装类_variant_t
将其错误地转换为布尔值。但我需要将它作为指针放入,以便 .NET 的 COM-Marshaller 将其识别为IntPtr
.
我读过的主题之一是 MSDN Social上的主题。他们提出了这样的解决方案:
VARIANTARG Arg;
VariantInit(&Arg);
V_VT(&Arg) = VT_INT;
V_INT(&Arg) = (int)m_hWnd;
这个解决方案的问题是,V_INT
(member intVal
) 是一个32 位整数并强制指针为 32 位指针。换句话说:我不能传输 64 位指针。有没有解决这个问题的办法?还有其他方法可以将其作为 64 位整数传输吗?
我已经通过一些代码对此进行了测试。因此,我使用一个 .NET 方法来接收任何内容System.Object
并输出其值和类型。
public static void TakePtr(object ptr)
{
Console.WriteLine("Received a " + ptr.GetType() + " with value " + ptr);
}
MyVARIANT
填充了兼容性,v.llVal = 0; v.byref = myPointer;
因此它应该始终正确编译关于 32/64 位指针。此外,我需要设置变体类型,以便 .NET 将其映射到System.IntPtr
不强制转换。(因为对于真正的程序集,我无法更改代码,也不想包装它。这会增加主要的复杂性。)。
- .NET
System.IntPtr
向后传输一个 asVT_INT
,将映射前向System.Int32
. VT_I8
映射到System.Int64
但不是System.IntPtr
。
那么什么VARENUM
标志会指定一个System.IntPtr
?