【问题标题】:How to pass IUnknown argument to a COM interface using C#?如何使用 C# 将 IUnknown 参数传递给 COM 接口?
【发布时间】:2014-05-12 17:10:51
【问题描述】:
我有一个这样定义的 COM 接口
interface Client : IUnknown
{
[id(1)] HRESULT GetSomething
(
enum SomeID someID,
[out] IUnknown **pUnknown
);
};
如何使用 C# 传递 IUnknown 对象?
【问题讨论】:
标签:
c#
com
iunknown
com-interface
【解决方案1】:
你不传递任何东西,它返回一个接口指针。一个不透明的 IUnknown 由所有 COM 接口实现。在 C# 中,它将是 object 类型的对象,“可以是任何东西”的托管版本。所以基本代码是这样的:
object retval;
client.GetSomething(SomeID.Magic, out retval);
然后由您将返回的对象转换为实际的接口类型,可能基于 Magic。你的问题根本没有暗示它可能是什么,你必须阅读 COM 组件的文档才能有一个想法。
【解决方案2】:
假设您对对象一无所知任何事情,您可能会使用 IntPtr 来表示 IUnknown,然后使用 Marshal.GetUniqueObjectForIUnknown 为其获取 RCW:
// Get some object
IntPtr ptrObj = IntPtr.Zero;
Client.GetSomething(someID, out ptrObj);
object obj = Marshal.GetUniqueObjectForIUnknown(ptrIProfferService);