Chr*_*ner 3 .net c++ com marshalling variant
如何将void指针(aka.void*
或handle)放入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;
Run Code Online (Sandbox Code Playgroud)
这个解决方案的问题是,V_INT
(成员intVal
)是一个32位整数,并强制指针为32位指针.换句话说:我无法传输64位指针.这个问题有什么解决方案吗?任何其他方式把它作为64位整数转移?
我已经通过一些代码对此进行了测试.因此,我使用.NET方法接收任何System.Object
并输出其值和类型.
public static void TakePtr(object ptr)
{
Console.WriteLine("Received a " + ptr.GetType() + " with value " + ptr);
}
Run Code Online (Sandbox Code Playgroud)
我VARIANT
的兼容性已经填满,v.llVal = 0; v.byref = myPointer;
所以它应该总是正确地编译32/64位指针.此外,我需要设置变体类型,以便.NET mapps它System.IntPtr
而不需要强制转换.(因为对于真正的程序集,我无法更改代码,也不想包装它.这会增加主要的复杂性.)
System.IntPtr
向后传输,向前传输VT_INT
mapps System.Int32
.VT_I8
mapps System.Int64
但不是System.IntPtr
.那么什么VARENUM
标志会指定一个System.IntPtr
?
这是不可能的,VARIANT是一种自动化类型.自动化不喜欢处理指向未知类型的指针,没有安全的方法来取消引用它们.支持的唯一指针类型是IUnknown*和IDispatch*,接口指针.
充其量你可以将它存储为VT_I8,它可以整理到很长时间.然后你可以将其转换为IntPtr.