说我想为IMMDeviceEnumerator创建界面。
我在网上看到的例子显示了这个定义:
[ComImport]
[Guid("A95664D2-9614-4F35-A746-DE8DB63617E6")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IMMDeviceEnumerator
{
}
我理解(也许): [ComImport]
属性指定它来自dll。 [Guid]
属性是接口标识符。
我不明白:这个GUID值是如何获得的? [InterfaceType]
属性有什么作用?如何填写其余功能?
我很想丢掉这些东西,所有的文档都是超级不透明的。
答案 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 docs为out there,但通常情况下,如果您只是尝试使用众所周知的COM组件,则最好使用library,如果可以的话。
答案 1 :(得分:0)
您自己创建GUID。如果您不想自己分配一台发电机,那么就有在线发电机。
所有接口类型都应来自IUnknown
。
更新:这是一个发电机。 https://www.guidgenerator.com/online-guid-generator.aspx
他们使用相同的一个,因为已经使用该特定GUID定义了IMMDeviceEnumerator
。如果您创建自己的界面,您将创建自己的GUID。
您派出IUnknown
因为
"在该约束中,您的自定义接口几乎可以支持任何方法或参数,包括异步方法。您还可以为自定义接口生成类型库,以便客户端可以在运行时访问有关对象方法的信息。 "