【发布时间】:2012-06-02 07:22:48
【问题描述】:
如何将 void 指针(又名void* 或句柄)放入 COM VARIANT-Type。包装类_variant_t 将其错误地转换为布尔值。但我需要将其作为指针放入,以便 .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?
【问题讨论】:
标签: c++ .net com marshalling variant