了解COM对象以及如何声明它们

时间:2016-03-29 23:13:30

标签: c# winapi com attributes

说我想为IMMDeviceEnumerator创建界面。

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

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

}

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

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

我很想丢掉这些东西,所有的文档都是超级不透明的。

2 个答案:

答案 0 :(得分:1)

  

如何获得此GUID值?

GUID是作为COM接口定义的一部分创建的;因为你试图打电话给别人的对象 - 你需要使用他们的GUID。您可以在mmdeviceapi.h MMDevice 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,如果可以的话。

答案 1 :(得分:0)

您自己创建GUID。如果您不想自己分配一台发电机,那么就有在线发电机。

所有接口类型都应来自IUnknown

更新:这是一个发电机。 https://www.guidgenerator.com/online-guid-generator.aspx

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

您派出IUnknown因为

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