Реестр Windows – это
общедоступная база данных операционной системы. Реестр содержит информацию об
аппаратном и программном обеспечении, о конфигурации компьютера и о
пользователях. Клиенты могут искать там нужные компоненты.
Информация в реестре упорядочена иерархически и имеет
несколько предопределенных высокоуровневых разделов. В разделе 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. Наиболее
употребляемые из них:
Для того, чтобы поместить информацию о
компоненте в реестр Windows, необходимо экспортировать
две функции:
STDAPIDLLRegisterServer
( );
STDAPIDLLUnregesterServer
( );
[STDAPIопределен
в objBASE.Hкак #defaneSTDAPIEXTERN_CHRESULTSTDAPICALLTYPEчто раскрывается
в extern "C” HRESULT_stdcall]
С помощью программы утилиты REGSVR32.TXT эти функции
можно вызывать для регистрации компонента.
Большинство программ установки вызывают
DLLRegisterServer в процессе своей работы. Для этого нужно загрузить DLL с помощью LoadLibrery,
получить адрес функции с помощью GetProcAddress и
потом вызвать функцию.
Клиент определяет, какой компонент ему
следует использовать, но прежде, чем создать экземпляр этого компонента, надо
определить, поддерживает ли компонент нужные интерфейсы.
Решение этой проблемы дают категории
компонентов. Категория компонентов – это набор интерфейсов, которым присвоен CLSID, называемый в Ланном случаеCATID.
Компоненты, реализующие все интерфейсы некоторой категории, могут
зарегистрироваться, как члены данной категории. Это позволяет клиентам более
осмысленно выбирать компоненты из реестра, рассматривать только те, которые
принадлежат к некоторой категории.
Компонент может входить в произвольное
число категорий. Компонент не обязан поддерживать исключительно те интерфейсы,
которые определены категорией, он может поддерживать любой интерфейс в
дополнение к ним.
В системе Windows, имеется стандартный диспетчер категории компонентов
(CLSID_StdComponentCategoriesMgr) – стандартный компонент СОМ, реализующий два
интерфейса, ICatRegisterи ICatInformation.ICatRegister
используется для регистрации и удаления категорий, для дебавления и удаления
компонентов к категории. С помощью ICatInformation можно найти:
1) все категории зарегистрированные в
системе;
2) все компоненты , принадлежащие
данной категории;
3) все категории, которым принадлежит
данный компонент.
[Редактор реестра
показывает все данные в виде списка CLSID.] Хорошим средством просмотра реестра с точки зрения СОМ является
утилита OLEVIEW,
представляемая Visial С++ и средой SDK. Она обеспечивает несколько различных подходов к использованию
компонентов в вашей системе. Вместо длинного списка CLSID и других CUIDOLEVIEW
отображает деревья, содержащие элементы с дружественными именами. Кроме того, OLEVIEW позволяет просматривать категории компонентов,
установленных в системе.