Windows 如何设法找到具有相应 CLSID 的 COM 组件
CoCreateInstance
:
CoCreateInstance 函数通过连接到与指定 CLSID 关联的类对象、创建未初始化的实例并释放类对象来提供方便的快捷方式。因此,它封装了以下功能:CoGetClassObject
...
CoGetClassObject
:
对 CoGetClassObject 的调用创建、初始化并授予调用者对类对象的访问权(通过指向使用 riid 参数指定的接口的指针)。类对象是与您在 rclsid 参数中指定的 CLSID 关联的对象。系统如何在计算机中定位相关代码和数据的细节对调用者是透明的,任何尚未加载的代码的动态加载也是如此。
[...]
有两个地方可以找到一个类的 CLSID: (1) 注册表保存 CLSID 和文件后缀之间的关联,以及 CLSID 和文件签名之间的关联,以确定对象的类。(2) 当一个对象被保存到持久化存储时,它的 CLSID 和它的数据一起存储。
正如 MSDN 所说,查找对调用者是透明的,并且它嵌入了多个来源:一些 CLSID 可能由服务器显式注册并且是查找的优先级,然后是每个用户的 COM 类注册表、机器范围的注册表、“视为”记录等.
据推测,最常见的情况如下。COM 服务器(应用程序或 DLL)在其安装过程中向系统注册表注册其 CLSID。然后系统注册表保存一个记录,在该记录下HKEY_CLASSES_ROOT
保存有关特定信息CLSID
以及如何定位与其相关联的代码。然后CoCreateInstance
和朋友们在调用者请求中查找此信息并执行魔术让调用者获取请求的 CLSID 的可调用接口指针。
尤其是这种情况CLSID_UIRibbonFramework
,其相关信息在注册表下HKEY_CLASSES_ROOT\CLSID\{926749fa-2615-4987-8845-c33e65f2b957}
。