c++ - 如何将 void* 放入 COM VARIANT,以便它被 COM-Interop 编码为 IntPtr 到 .NET?

标签 c++ .net com marshalling variant

如何将空指针(又名。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);
}

我的 VARIANTv.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/

相关文章:

c# - 跨版本的 COM 引用名称更改(Win7 CERTCLIENTLib 到 Win8 CERTCLILib)

C++指针运算 "lvalue required as left operand of assignment"错误

c# - WPF 列表框虚拟化创建 DisconnectedItems

c# - 如何将相同的 DataSource 用于多个 DataGridView,并在每个 DataGridView 上应用不同的过滤器?

c# - 不同的字符串比较方法有什么区别

.net - COM+ 长时间运行的方法导致其他方法阻塞/挂起

python - 如何强制 python(使用 win32com)创建一个新的 excel 实例?

c++ - 一个人的嵌入式项目示例

c++ - 分区 boost::range::transformed 范围适配器

c++ - qSort 的问题