如何将void*放入COM VARIANT,以便通过COM-Interop将其作为IntPtr编组到.NET?

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 而不需要强制转换.(因为对于真正的程序集,我无法更改代码,也不想包装它.这会增加主要的复杂性.)

  • .NET System.IntPtr向后传输,向前传输VT_INTmapps System.Int32.
  • VT_I8mapps System.Int64但不是System.IntPtr.

那么什么VARENUM标志会指定一个System.IntPtr

Han*_*ant 5

这是不可能的,VARIANT是一种自动化类型.自动化不喜欢处理指向未知类型的指针,没有安全的方法来取消引用它们.支持的唯一指针类型是IUnknown*和IDispatch*,接口指针.

充其量你可以将它存储为VT_I8,它可以整理到很长时间.然后你可以将其转换为IntPtr.