理解COM对象及其声明方法

3

我想创建IMMDeviceEnumerator的接口。

我在网上看到一些示例,显示定义如下:

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

}

我理解的是: [ComImport] 属性指定它来自于一个dll。 [Guid] 属性是接口标识符。
我不理解的是:这个GUID值是如何获得的?[InterfaceType] 属性是做什么的?如何填写其余的函数?
我试图弄清楚这些内容,但所有的文档都非常晦涩难懂。
2个回答

2
这个GUID值是怎么得到的?
GUID是作为COM接口定义的一部分创建的;因为你要调用别人的对象 - 你需要使用他们的GUID。你可以在mmdeviceapi.h头文件中找到它,MMDevice文档已经指出了这一点。
Mmdeviceapi.h头文件定义了MMDevice API中的接口。
 MIDL_INTERFACE("A95664D2-9614-4F35-A746-DE8DB63617E6")
    IMMDeviceEnumerator : public IUnknown

常规的方法是添加对COM dll的引用,或运行tlbimp.exe生成带有所有魔法的COM类包装器。

但如果没有COM类型库,那么您基本上必须通过查看IDL文件来自己完成。

像p/invoke签名一样,这可能会非常痛苦,因此最好使用现有的工具,如IMMDeviceEnumerator

对于更大的COM互操作问题,它基本上需要学习一些COM并熟悉C#。 一般文档可以在这里找到,但通常,如果您只是尝试使用一个知名的COM组件,则最好使用(如果可以)。


这是正确的。我的意思是,如果你正在创建自己的,你需要创建自己的Guid。 - Seth Kitchen
这非常有帮助,非常感谢您指引我去那个库! - flakes

0

你可以自己创建GUID。如果你不想自己分配,也有在线生成器。

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

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

他们使用相同的GUID,因为IMMDeviceEnumerator已经用那个特定的GUID定义过了。如果你创建自己的接口,你将创建自己的GUID。

你从IUnknown派生,因为

“在这个约束条件下,你的自定义接口几乎可以支持任何方法和参数,包括异步方法。你还可以为你的自定义接口生成类型库,以便客户端可以在运行时访问关于你的对象方法的信息。”


2
似乎不太有帮助,因为OP似乎正在寻找现有接口的互操作代码。 - Alexei Levenkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接