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

How to obtain the IID of a registered COM interface?

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

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

我已经阅读了文章 COM IDs & Registry keys in a nutshell,这个问题对我来说仍然是悬而未决的。不幸的是,我现在没有测试用例。

注册表并不是一种编程资源,注册表项仅在 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 回来了。

类型库是一种友好的方式,它是对已实现的协同类和接口的语言独立描述,几乎任何编译器都知道如何阅读。有时作为单独的 .tlb 或 .olb 文件提供,但通常作为资源嵌入可执行文件中。查看它的最佳方法是使用 Oleview.exe SDK 实用程序。使用 File > View Typelib 和 select .tlb 或 .dll 文件。它将类型库反编译回 IDL,这是 COM 作者用来描述其组件的语言。找回 IID 不会有任何问题。您唯一需要知道的是可执行文件的名称。

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