我试图找到答案,但没有运气。没有关于如何使用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!
答案 0 :(得分:5)
这是一种低级方法,就像所有Marshal方法一样,并不打算做你想要的。只有在需要将接口指针传递给本机代码时才使用它。
CLR将自动为您调用IUnknown :: QueryInterface(),而无需显式编程。您可以通过在C#代码中使用强制转换来实现:
ISomething itf = (ISomething)pMyFilter;
请注意,如果对象未实现接口,则会引发异常。请注意,ISomething必须使用[ComImport]属性声明,就像IBaseFilter一样。如果导入了类型库,则为自动。正是该属性提供了CLR正确调用QueryInterface所需的IID。