C#语法中的QueryInterface和IntPtr

时间:2012-09-25 13:38:40

标签: c# .net syntax com marshalling

我正在尝试使用InteropServices.Marshal.QueryInterface将COM对象转换为C#中的特定类型,但是我无法传递第一个和最后一个参数。

我假设IntPtr是一个引用,但由于语法错误,我无法让IntPtr引用我的类来使用QueryInterface。

当然,下面显示的代码没有正确的语法,但它可以让您了解我想要做的事情。

set
{
    ClassA a;
    Guid guid = Guid.Parse("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX");
    System.Runtime.InteropServices.Marshal.QueryInterface(ref value, 
        ref guid, out a);
}

编辑:

[ComVisible(true), Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")]
public ClassA : COMInterface{ ... }

ClassA是C#类,COMInterface是COM接口。它是唯一实现COMInterface的类。 value范围中的set是对COM接口的引用,COMInterface

1 个答案:

答案 0 :(得分:3)

你无法做到这一点。

您拥有的IntPtr是指向COMInterface实施的指针。完全可行的是,您可以拥有一个完全独立的类来实现COMInterface,以及您持有指针的内容。

也就是说,对QueryInterface的调用只能用于获取对COMInterface的.NET表示的引用,而不是ClassA的实例;它需要您将在非托管代码中实现COMInterface的类的内容整形为托管代码可以理解的内容,然后将其写入ClassA,这完全是另一回事。