如何获取已注册COM接口的IID?

时间:2016-07-27 07:57:36

标签: windows com registry

我知道我可以从Classes\<CLASSNAME>\CLSID\@的注册表中的COM类对象中读取CLSID。

我怀疑在已注册的COM界面上,我可以从Classes\<CLASSNAME>\IID\@Classes\CLSID\<CLSID>\IID读取IID。

我已阅读文章COM IDs & Registry keys in a nutshell,这个问题仍对我开放。不幸的是,我现在没有测试用例。

1 个答案:

答案 0 :(得分:5)

注册表并不是一个编程资源,注册表项仅在COM基础结构需要它们时才存在。例如,CLSID键是帮助COM找到实现服务器的可执行文件所必需的,程序员必须提供CLSID guid。

他也需要知道IID,将其传递给QueryInterface()以获取接口指针。 可能是HKLM \ Software \ Classes \ Interface中的一个条目,但它并不常见。当需要将接口从一个公寓封送到另一个公寓时,COM基础结构需要它,注册表项包含有助于完成该工作的代理的CLSID。在该密钥中快速查看Regedit.exe应该说服您根本不可能有所帮助,与服务器本身没有任何联系。只有你很幸运,你才能在那里找到一个类型库LIBID。

COM程序员为您提供CLSID和IID值有两种基本方法。不友好的方式是.idl或.h文件,几个Windows组件(DirectX,Media Foundation,WASAPI等)就是这样。足以看到IID回来了。

友好的方式是一个类型库,一个与语言无关的已实现的coclasses和接口的描述,几乎任何编译器都知道如何读取。有时作为单独的.tlb或.olb文件提供,但通常作为资源嵌入可执行文件中。最好的方法是使用Oleview.exe SDK实用程序。使用文件&gt;查看Typelib并选择.tlb或.dll文件。它将类型库反编译回IDL,IDL是COM作者用来描述其组件的语言。你可以毫不费力地找回IID。您唯一需要知道的是可执行文件的名称。

一定要利用编译器中的类型库,假设你找到了一个。您现在可以使用友好名称而不是原始GUID,对代码进行语法检查,并且在版本更改且作者正确使用新IID时,很少需要做任何戏剧性的事情。如果你找不到一个,请务必与作者交谈,一个小提示可以为你节省大量的麻烦。

相关问题