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

标签 c# com

我试图找到这个问题的答案,但完全没有运气。没有关于如何使用 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/

相关文章:

c# - 如何计算整数值范围的位(和字节)宽度

c# - 使用 Azure AD Graph 客户端 API 更改用户密码的权限问题

c# - 两个 WinForms 之间传递的 XPTable 数据

c# - 如何调试此 WCF Web 服务? ("ServiceChannel is in the Faulted state")

c# - 从 C++ 创建 COM 对象?

具有 VBA 延迟出价的 Python COM 服务器 + 跳过获胜注册(无管理员权限)

.net - 由于以下错误 : 80040154,检索 CLSID {xxxx} 组件的 COM 类工厂失败

c++ - 启动 VirtualBoxSDK 测试应用程序返回错误 "Error creating virtual box instance"

c# - 在 Linux 中运行从 .Net Framework 编译的 .exe 的方法

vb.net - "Option Strict On disallows implicit conversions"执行不一致