§ 14. Реестр Windows.
Реестр Windows – это
общедоступная база данных операционной системы. Реестр содержит информацию об
аппаратном и программном обеспечении, о конфигурации компьютера и о
пользователях. Клиенты могут искать там нужные компоненты.
§ 14.1. Организация реестра.
Информация в реестре упорядочена иерархически и имеет
несколько предопределенных высокоуровневых разделов. В разделе HKEY_CLASSES_ROOT хранится
информация о компоненте. Важным подразделом
HKEY_CLASSES_ROOT является CLSID
(идентификаторы классов), в котором описывается каждый компонент, установленный
в системе. В Windows95 и WindowsNT существуют программы редактирования реестра REGEDIT.EXE и REGEDIT32.EXE (редактируя
реестр легко повредить систему).
CLSID компонента хранится в реестре как строка формата
(ххххххх_хххх_хххх_хххх_ххххххххххх) идентификатор класса CLSID компонента является его уникальным идентификатором,
однако он неудобен для чтения и запоминания. Понятие ProgID (программный идентификатор) включено в СОМ для
облегчения взаимодействия с компонентами разработчиков. ProgID отображает «дружественную», понятную программисту
строку в CLSID. Уникальность ProgID не гарантируется. По соглашению ProgID имеет следующий формат
<Программа>.<Компонент>.<Версия>
(до 39 символов версия необязательна)
В CLSID есть еще
подраздел InprocServer32.
Его параметр по умолчанию – имя файла DLL.
DLL – это сервер в процессе; она загружается в процессе
клиента и предоставляет ему сервисы.
После того, как
вы поместили в реестр нужную информацию, получить CLSID по ProcID и
наоборот легко. Библиотека СОМ API
предоставляет несколько функций, предназначенных для сравнения, создания и
преобразования типов GUID. Наиболее
употребляемые из них:
Функция |
Назначение |
CoCreateGuid (Guid*pGuid) |
Обеспечивает создание
одного уникального GUID |
ISEgualIID (REFIID, REFIID ) |
Сравнивает два IID |
ISEgualIID (REFCLSID, REFCLSID ) |
Сравнивает два CLSID |
CLSIDFromProgID (LPCOLESTR, LPCLSID) |
Возвращает CLSID для задания ProgID |
ProgIDFromCLSID (REFCLSID,
LPOLESTR*) |
Возвращает ProgID для CLSID |
§ 14.2. Саморегистрация.
Для того, чтобы поместить информацию о
компоненте в реестр Windows, необходимо экспортировать
две функции:
STDAPI DLLRegisterServer
( );
STDAPI DLLUnregesterServer
( );
[STDAPI определен
в objBASE.H как #defane
STDAPI EXTERN_C HRESULT STDAPICALLTYPE что раскрывается
в extern "C” HRESULT_stdcall]
С помощью программы утилиты REGSVR32.TXT эти функции
можно вызывать для регистрации компонента.
Большинство программ установки вызывают
DLLRegisterServer в процессе своей работы. Для этого нужно загрузить DLL с помощью LoadLibrery,
получить адрес функции с помощью GetProcAddress и
потом вызвать функцию.
§ 14.3.
Категории компонентов.
Клиент определяет, какой компонент ему
следует использовать, но прежде, чем создать экземпляр этого компонента, надо
определить, поддерживает ли компонент нужные интерфейсы.
Решение этой проблемы дают категории
компонентов. Категория компонентов – это набор интерфейсов, которым присвоен CLSID, называемый в Ланном случае CATID.
Компоненты, реализующие все интерфейсы некоторой категории, могут
зарегистрироваться, как члены данной категории. Это позволяет клиентам более
осмысленно выбирать компоненты из реестра, рассматривать только те, которые
принадлежат к некоторой категории.
Компонент может входить в произвольное
число категорий. Компонент не обязан поддерживать исключительно те интерфейсы,
которые определены категорией, он может поддерживать любой интерфейс в
дополнение к ним.
В системе Windows, имеется стандартный диспетчер категории компонентов
(CLSID_StdComponentCategoriesMgr) – стандартный компонент СОМ, реализующий два
интерфейса, ICatRegister и ICatInformation. ICatRegister
используется для регистрации и удаления категорий, для дебавления и удаления
компонентов к категории. С помощью ICatInformation можно найти:
1) все категории зарегистрированные в
системе;
2) все компоненты , принадлежащие
данной категории;
3) все категории, которым принадлежит
данный компонент.