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;