我最近在探索如何在c ++中使用COM并遇到一个简单的功能区代码。
代码有:
HRESULT hr = CoCreateInstance(CLSID_UIRibbonFramework, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&g_pFramework));
所以,它基于COM,对吧?组件服务中应该有关于此组件的一些信息,但无论如何我都找不到它。
我的问题是Windows如何设法找到头文件(UIRibbon.h
)中提供的相应CLSID的COM组件?
答案 0 :(得分:0)
windows如何设法找到具有相应CLSID的COM组件
CoCreateInstance函数通过连接到与指定CLSID关联的类对象,创建未初始化的实例以及释放类对象来提供方便的快捷方式。因此,它封装了以下功能:
CoGetClassObject
...
对CoGetClassObject的调用创建,初始化并向调用者访问(通过指向使用riid参数指定的接口的指针)给类对象。类对象是与您在rclsid参数中指定的CLSID关联的对象。 系统如何在计算机中查找关联的代码和数据的详细信息对调用者来说是透明的,动态加载任何尚未加载的代码也是如此。
[...]
有两个地方可以找到一个类的CLSID: (1)注册表包含CLSID和文件后缀之间的关联,以及CLSID和文件签名之间的关联,用于确定对象的类。 (2)当一个对象保存到持久存储器时,其CLSID与其数据一起存储。
正如MSDN所说查找对调用者是透明的并且它嵌入了多个源:一些CLSID可能由服务器显式注册并且是查找的优先级,然后是每个用户的COM类注册表,机器范围的注册表,&#34 ;对待"记录等。
据推测,最常见的情况如下。 COM服务器(应用程序或DLL)将其CLSID与系统注册表一起注册为其安装的一部分。然后系统注册表在HKEY_CLASSES_ROOT
下保存一条记录,其中包含有关特定CLSID
的信息以及如何查找与其关联的代码。然后CoCreateInstance
和朋友在调用者请求中查看此信息并执行魔术,让调用者获取所请求的CLSID的可调用接口指针。
特别是CLSID_UIRibbonFramework
的情况,其相关信息在HKEY_CLASSES_ROOT\CLSID\{926749fa-2615-4987-8845-c33e65f2b957}
下的注册表中。