【问题标题】:Understanding COM Objects and how to declare them了解 COM 对象以及如何声明它们
【发布时间】:2016-03-29 23:13:29
【问题描述】:

假设我想为IMMDeviceEnumerator 创建接口。

我在网上看到了显示定义的示例:

[ComImport]
[Guid("A95664D2-9614-4F35-A746-DE8DB63617E6")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IMMDeviceEnumerator
{

}

我的理解(也许):[ComImport] 属性指定它来自 dll。 [Guid] 属性是接口标识符。

我不明白的地方:这个 GUID 值是如何获得的? [InterfaceType] 属性有什么作用?如何填写其余的功能?

我很想弄清楚这些东西,所有文档都非常不透明。

【问题讨论】:

    标签: c# winapi com attributes


    【解决方案1】:

    这个 GUID 值是如何获得的?

    GUID 是作为 COM 接口定义的一部分创建的;因为你试图调用别人的对象 - 你需要使用他们的 GUID。您可以在mmdeviceapi.hMMDevice docs 指向中找到它。

    头文件 Mmdeviceapi.h 定义了 MMDevice API 中的接口。

     MIDL_INTERFACE("A95664D2-9614-4F35-A746-DE8DB63617E6")
        IMMDeviceEnumerator : public IUnknown
    

    执行此操作的常规方法是添加对 COM dll 的引用或运行 tlbimp.exe,它会为您生成一个带有所有魔法粘性的 COM 类包装器。

    如果 COM 类型库不可用,那么您基本上必须通过 IDL 文件自己完成。

    就像 p/invoke 签名一样,这会很痛苦 - 所以best to use an existing one if you can

    对于COM互操作的较大问题,基本上需要学习一点COM和熟悉C#。 general docsout there,但通常如果你只是想使用一个众所周知的 COM 组件,你最好尽可能使用 library

    【讨论】:

    • 这是正确的。我的意思是,如果您正在创建自己的 Guid,那么您将创建自己的 Guid。
    • 这很有帮助。非常感谢你把我带到那个图书馆!
    【解决方案2】:

    您自己创建 GUID。如果您不想自己分配生成器,在线上有生成器。

    所有接口类型都应派生自IUnknown

    更新:这是一个生成器。 https://www.guidgenerator.com/online-guid-generator.aspx

    他们使用同一个,因为 IMMDeviceEnumerator 已经使用该特定 GUID 进行了定义。如果您创建自己的界面,您将创建自己的 GUID。

    你推导出IUnknown,因为

    “在该约束内,您的自定义接口几乎可以支持任何方法或参数,包括异步方法。您还可以为自定义接口生成类型库,以便客户端可以在运行时访问有关对象方法的信息。”

    【讨论】:

    • 不太可能对似乎正在为现有接口寻找互操作代码的 OP 有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 2016-12-22
    • 2018-06-27
    • 1970-01-01
    • 2018-12-03
    • 2012-05-27
    • 1970-01-01
    相关资源
    最近更新 更多