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

C# Marshal.QueryInterface()-如何使用返回值?,c#,com,C#,Com,我试图找到答案,但一点运气都没有。没有关于如何使用由Marshal.QueryInterface返回的值的文档(在我的例子中是“pISomething”)。它是IntPtr的实例,但我需要它作为ISomething的实例。简单强制转换不起作用。那么,有人可以演示如何使用由Marshal.QueryInterface返回的接口吗 例如: IBaseFilter pMyFilter = getMyFilter(); IntPtr pUnknown = Marshal.GetIUnknownForO

我试图找到答案,但一点运气都没有。没有关于如何使用由
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!

与所有封送处理方法一样,它是一种低级方法,不打算执行您想要的操作。仅当需要将接口指针传递给本机代码时才使用它

CLR将自动为您调用IUnknown::QueryInterface(),而无需显式编程。只需在C代码中使用强制转换即可:


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

success
值是
HRESULT
,而不是
bool
。这意味着0实际上是
S_OK
,这意味着它成功了。请参阅@Zdeslav,感谢您提供的COM基础知识,但这不是问题所在。我现在有一个
pISomething
,我对此无能为力。如何在COM对象上调用某个方法,这是我的问题?哦,对了,我知道它失败了。你在演员阵容中犯了什么错误?我希望它能起作用?你有什么例外?在
pISomething
上调用
Marshal.GetObjectForIUnknown
会得到什么?如何解释
ISomething itf=(ISomething)pMyFilter失败,而
int success=Marshal.QueryInterface(pUnknown,ref IID_ISomething,out pISomething)成功?没有必要强迫我猜“失败”是什么意思。至少有一个合适的编译或异常消息。
 ISomething itf = (ISomething)pMyFilter;