Marshal.QueryInterface() - 如何使用返回值?

时间:2014-02-23 13:59:27

标签: c# com

我试图找到答案,但没有运气。没有关于如何使用Marshal.QueryInterface返回的值的文档(在我的情况下是'pISomething')。它是IntPtr的一个实例,但我需要它作为ISomething的实例。简单的演员表不起作用。那么,有人可以展示如何使用Marshal.QueryInterface返回的界面吗?

示例:

IBaseFilter pMyFilter = getMyFilter();

IntPtr pUnknown = Marshal.GetIUnknownForObject(pMyFilter);

IntPtr pISomething;
int success = Marshal.QueryInterface(pUnknown, ref IID_ISomething, out pISomething);

// success = 0 here!

1 个答案:

答案 0 :(得分:5)

这是一种低级方法,就像所有Marshal方法一样,并不打算做你想要的。只有在需要将接口指针传递给本机代码时才使用它。

CLR将自动为您调用IUnknown :: QueryInterface(),而无需显式编程。您可以通过在C#代码中使用强制转换来实现:

 ISomething itf = (ISomething)pMyFilter;

请注意,如果对象未实现接口,则会引发异常。请注意,ISomething必须使用[ComImport]属性声明,就像IBaseFilter一样。如果导入了类型库,则为自动。正是该属性提供了CLR正确调用QueryInterface所需的IID。