如何将空指针(又名。void*
或句柄)放入 COM VARIANT
-类型。包装类 _variant_t
将其错误地转换为 bool 值。但我需要将它作为指针放入,以便 .NET 的 COM-Marshaller 将其识别为 IntPtr
.
我读过的主题之一是 this one at MSDN Social .他们提出了这样的解决方案:
VARIANTARG Arg;
VariantInit(&Arg);
V_VT(&Arg) = VT_INT;
V_INT(&Arg) = (int)m_hWnd;
这个解决方案的问题是,V_INT
(成员 intVal
)是一个 32 bit integer并强制指针为 32 位指针。换句话说:我无法传输 64 位指针。这个问题有什么解决方案吗?还有其他方法可以将其作为 64 位整数传输吗?
我已经通过一些代码对此进行了测试。因此,我使用了一个 .NET 方法来接收任何 System.Object
并输出它的值和类型。
public static void TakePtr(object ptr)
{
Console.WriteLine("Received a " + ptr.GetType() + " with value " + ptr);
}
我的 VARIANT
由 v.llVal = 0 填充以实现兼容性; v.byref = myPointer;
因此对于 32/64 位指针,它应该始终正确编译。
此外,我需要设置变体类型,以便 .NET 将其映射到 System.IntPtr
而无需强制转换。 (因为对于真正的程序集,我不能更改代码并且不想包装它。这会增加主要的复杂性。)。
- .NET 将
System.IntPtr
向后传输为VT_INT
,它将映射转发到System.Int32
。 VT_I8
映射到System.Int64
但不是System.IntPtr
。
那么什么 VARENUM
标志会指定一个 System.IntPtr
?
最佳答案
那不可能,VARIANT 是一种自动化类型。自动化不喜欢处理指向未知类型的指针,没有安全的方法来取消引用它们。唯一支持的指针类型是 IUnknown* 和 IDispatch*,接口(interface)指针。
充其量您可以将其存储为 VT_I8,它编码为 long。然后您可以将其转换为 IntPtr。
关于c++ - 如何将 void* 放入 COM VARIANT,以便它被 COM-Interop 编码为 IntPtr 到 .NET?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10775953/