2016-07-27 26 views

回答

4

注册表并不是一个编程资源,当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实用程序查看它。使用文件>查看Typelib并选择.tlb或.dll文件。它将类型库反编译回IDL,即COM作者用来描述其组件的语言。你很难找回IID。只有你必须知道的是可执行文件的名称。

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

+0

谢谢。长话短说,我无法在注册表中选择IID。顺便说一句,我在'Classes \ CLSID \ \ TypeLib'中发现了一个TypeLib GUID,但是这是通过许多类对象共享的。我认为这是你指的LIBID。 – modiX

+1

如果你有LIBID,那么你是黄金的,看看HKLM \ Software \ Classes \ Typelib,你会发现类型库文件的路径。您想在OleView.exe中选择的那个。当然,一个类型库通常有多个同类。 –

+0

谢谢,就是这样。我可以找到与TypeLib(LIBID)以及TypeLib条目本身相同的大量接口。这帮了很多。 – modiX