如何将空指针(又名void*
或句柄)放入COM变量
-类型。包装器类_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
(成员intVal
32位整数,并强制指针为32位指针。换句话说:我无法传输64位指针。这个问题有什么解决方案吗?还有其他方法可以将其作为64位整数传输吗?
我已经用一些代码测试过了。因此,我使用a。NET方法接收任何系统。对象
,并输出其值和类型。
public static void TakePtr(object ptr)
{
Console.WriteLine("Received a " + ptr.GetType() + " with value " + ptr);
}
My VARIANT
is filled for compatibility by v.llVal = 0; v.byref = myPointer;
so it should get compiled always correctly regarding 32/64 bit pointers.
Furthermore I need to set the variant type so that .NET mapps it to System.IntPtr
without casting. (Because for the real Assembly I can t change the code and don t want to wrapp it. That would add major complexity.).
- .NET transfers a
System.IntPtr
backwards asVT_INT
, which forewards mapps toSystem.Int32
. VT_I8
mapps toSystem.Int64
but notSystem.IntPtr
.
因此,什么VARENUM
标志将指定一个系统。IntPtr
?