- •Изучение способов разработКи простейших com-объектов в среде delphi.
- •5.6 Методические указания.
- •5.6.1 Основные сведения о сом-объектах
- •5.6.2 Составляющие com-приложений
- •5.6.2.1 Способы взаимодействия com-клиентов с com-серверами
- •5.6.2.2 Регистрация com-сервера
- •5 .6.2.3 Библиотека com
- •1.6.2.4 Hresult.
- •5.6.2.5 Библиотека типов.
- •5.6.2.6 Общие сведения о com-клиентах
- •5.6.3 Объекты com в среде Delphi.
- •5.6.3.1 Средства реализации интерфейсов в среде Delphi.
- •5.6.3.2 Классы TcomObj, Coclass и tTypedComObject.
- •5.6.3.3 Пример простейшего приложения с применением интерфейсов.
- •ShowMessage(MyInterface.GetName);
- •5.6.4 Разработка структуры клиентского и серверного приложений.
- •5.6.5 Создание внутреннего сервера сом.
- •5.6.5.1 Создание динамической библиотеки.
- •5.6.5.2 Создание объекта сом.
- •5.6.5.3 Создание интерфейсов объекта сом.
- •5.6.5.4 Задание кода методов интерфейса.
- •5.6.6 Разработка клиентского приложения для внутреннего сервера
5.6.2.2 Регистрация com-сервера
В общем случае, схема получения СОМ-клиентом доступа к СОМ-объекту выглядит следующим образом:
Клиент запрашивает СОМ-объект;
Windows выполняет поиск СОМ-сервера запрошенного объекта, и, в случае, если таковой будет найден, выполняет запуск сервера и возвращает приложению-клиенту указатель на запрашиваемый интерфейс.
Информация о местоположении сервера находится в реестре Windows. СОМ использует эту информацию для поиска объектов и определения возможностей, которыми обладают объекты, зарегистрированные в системе. Поэтому, для того, чтобы можно было использовать СОМ-сервер, его необходимо зарегистрировать, сделав соответствующую запись в реестр. Регистрация осуществляется в ветви
HKEY_CLASSES_ROOT\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx},
где серия {хx…} представляет собой идентификатор класса (CLSID) этого СОМ-класса. Регистрация осуществляется путем создания раздела в этой ветви. Для внутренних СОМ-серверов это можно сделать несколькими способами:
внести соответствующую запись в реестр вручную;
создать вручную текстовый файл регистрации и с помощью утилиты regedit перенести (экспортировать) информацию из этого файла в Реестр. Формат команды, которая данные из файла с именем xxx.reg переносит в Реестр имеет вид: Regedit /s xxx.reg.
используя специальную системную утилиту RegSvr32;
созданием специальных приложений регистрации использующих функцию DllRegisterServer. Для удаления зарегистрированного внутреннего COM-сервера используется функция DllUnregisterServer;
использование возможностей программных средств (типа InstallShield и аналогичных ему) создания дистрибутивов для регистрации СОМ-серверов в процессе инсталляции приложений;
при разработке приложений в среде delphi можно воспользоваться командой Run | Register ActiveX Server главного меню.
Понятно, что последний способ применим лишь на компьютере разработчика приложения. Для регистрации СОМ-сервера на компьютере заказчика целесообразно использовать утилиту RegSvr32 или специальные приложения регистрации/инсталляции.
Примечание: Следует отметить, что все перечисленные выше способы (за исключением ручной записи в реестр или экспорта файла регистрации) используют обращение к функциям DllRegisterServer и DllUnregisterServer, т. е., по сути, утилиты и специализированные приложения используются как программные контейнеры, содержащие вызовы этих функций.
Внутреннее строение СОМ тесно связано с Реестром - с его предопределенными разделами, значениями и протоколом хранения данных. Например, когда приложение использует элемент управления ActiveX (известный ранее как элемент управления OLE), то оно создает экземпляр этого элемента управления либо с помощью его CLSID, либо через ProgID. Эти идентификаторы хранятся в Реестре. На рис. 5. показано, каким образом Реестр принимает участие в инстанцировании (создании экземляра) Com-объекта ExcelChart (диаграмма электронной таблицы).
При
установке приложения, поддерживающего
COM,
в системный реестр записывается
информация обо всех реализуемых этим
приложением объектах COM.
Кроме записи CLSID,
описанной выше, для всех объектов,
обязательно должен указываться тип
сервера (внутренний, локальный или
удаленный) и путь доступа к нему. Причем,
для внутренних
и локальных серверов
должно указываться полное имя динамической
библиотеки или исполняемого файла, а
для
удаленных серверов
– их полный сетевой адрес.
