gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:21:52 27 4
gpt4 key购买 nike

我试图找到这个问题的答案,但完全没有运气。没有关于如何使用 Marshal.QueryInterface 返回的值的文档。 (在我的情况下是“pISomething”)。它是 IntPtr 的一个实例,但我需要它作为 ISomething 的实例.简单的类型转换不起作用。那么,有人可以展示如何使用 Marshal.QueryInterface 返回的接口(interface)吗? ?

例子:

IBaseFilter pMyFilter = getMyFilter();

IntPtr pUnknown = Marshal.GetIUnknownForObject(pMyFilter);

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

// success = 0 here!

最佳答案

它是一种低级方法,就像所有 Marshal 方法一样,不是为了做你想做的事。只有在需要将接口(interface)指针传递给 native 代码时才使用它。

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

 ISomething itf = (ISomething)pMyFilter;

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

关于c# - Marshal.QueryInterface() - 如何使用返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21969155/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com