Недавно я изучал, как использовать COM в c ++, и наткнулся на простой код ленты.
Код имеет:
HRESULT hr = CoCreateInstance(CLSID_UIRibbonFramework, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&g_pFramework));
Итак, он основан на COM, верно? В Службе компонентов должна быть некоторая информация об этом компоненте, но я все равно не могу ее найти.
Мой вопрос заключается в том, как Windows удается найти COM-компонент с соответствующим CLSID, указанным в заголовочном файле (UIRibbon.h
)?
как windows удается найти COM-компонент с соответствующим CLSID
Функция CoCreateInstance предоставляет удобный ярлык, подключаясь к объекту класса, связанному с указанным CLSID, создавая неинициализированный экземпляр и освобождая объект класса. Как таковой, он включает в себя следующую функциональность:
CoGetClassObject
…
Вызов CoGetClassObject создает, инициализирует и предоставляет вызывающей стороне доступ (через указатель на интерфейс, указанный в параметре riid) к объекту класса. Объект класса — это объект, связанный с CLSID, который вы указываете в параметре rclsid. Подробная информация о том, как система находит связанный код и данные на компьютере, прозрачна для вызывающей стороны., как и динамическая загрузка любого кода, который еще не загружен.
[…]Есть два места, чтобы найти CLSID для класса:
(1) Реестр содержит связь между идентификаторами CLSID и суффиксами файлов, а также между идентификаторами CLSID и сигнатурами файлов для определения класса объекта.
(2) Когда объект сохраняется в постоянном хранилище, его CLSID сохраняется вместе с его данными.
Как говорится в MSDN, поиск прозрачен для вызывающей стороны и включает в себя несколько источников: некоторые CLSID могут быть явно зарегистрированы серверами и являются приоритетными для поиска, затем существует реестр COM-классов для каждого пользователя, реестр для всей машины, записи «Treat As» и т. Д. ,
Предположительно, наиболее частым сценарием является следующий. COM-сервер (приложение или DLL) регистрирует свои CLSID в системном реестре как часть своей установки. Тогда системный реестр содержит запись под HKEY_CLASSES_ROOT
который содержит информацию о конкретных CLSID
и как найти код, связанный с ним. затем CoCreateInstance
и друзья просматривают эту информацию по запросу вызывающего абонента и делают волшебство, позволяющее вызывающему получить указатель вызываемого интерфейса для запрашиваемого CLSID.
Это, в частности, случай CLSID_UIRibbonFramework
, с соответствующей информацией в реестре под HKEY_CLASSES_ROOT\CLSID\{926749fa-2615-4987-8845-c33e65f2b957}
,