double arrow

Многокомпонентная модель объектов (COM)

4.3.1.1. Общая характеристика COM

Одним из ключевых достижений Windows по праву считается многокомпонентная модель объектов (Component Object Model, COM). Модель COM описывает способ взаимодействия программ любого типа. Программа-сервер (сервер COM) предоставляет в распоряжение окружающих собственные службы, а программа-клиент (клиент COM) пользуется услугами доступных служб. Взаимодействующие COM-объекты могут функционировать как в рамках одного и того же процесса, так и в разных процессах, в том числе протекающих на разных машинах под управлением различных операционных систем. COM - это одновременно и спецификация (определяющая порядок создания взаимодействующих между собой приложений), и реализация (в форме стандартного набора функций API). Кроме того, COM - это независимая от платформы, распределенная объектно-ориентированная система, предназначенная для создания взаимодействующих программных компонентов.

С точки зрения стороннего наблюдателя создаваемый средствами COM программный компонент представляет собой черный ящик, обладающий следующими характеристиками:

1. Легкость подключения к операционной системе.

2. Автономность.

3. Простота интеграции в состав программного обеспечения.

4. Универсальный способ обращения к методам и свойствам из любого современного языка программирования.

Корпорация Microsoft стандартизировала как способ представления COM - объекта в памяти компьютера, так и особенности идентификации методов и свойств этого объекта. Поэтому в официальной документации Microsoft (MSDN) при описании COM неоднократно упоминается о том, что COM-модель соответствует бинарному (другими словами, универсальному) стандарту.

На первый взгляд черный ящик COM весьма похож библиотеку DLL.

Как и COM, DLL позволяет многократно использовать свой код, легко подключаться к ОС и интегрироваться в программное обеспечение. Но динамически подключаемая библиотека не в состоянии гарантировать, что экспортируемые ею функции без каких-либо ограничений могут быть вызваны средствами любого другого языка программирования. Кроме того, при работе c DLL мы сталкиваемся с рядом ограничений, связанных с местом ее размещения: библиотека должна располагаться либо в строгом перечне каталогов, либо обязательно прописываться в системных путях. Еще более сложная задача - загрузка DLL с другого компьютера. В отличие от DLL, модель COM обеспечивает универсальный способ загрузки своих объектов независимо от места их размещения.

С первых шагов изучения COM важно понять, что это не очередной объектно-ориентированный язык программирования со своим синтаксисом, семантикой и деталями реализации. Правильнее говорить о COM как о стандарте, определяющем модель взаимодействия между объектами.

В интересах клиентских и серверных приложений COM-модели активно трудится библиотека COM (COM Library). Физически библиотека COM представляет собой набор исполняемых файлов и динамически подключаемых библиотек. Она способна:

1. Предоставлять услуги некоторого набора функций API, облегчающих разработку приложений COM. Например, для клиентских приложений предназначены методы, создающие объекты. Для приложений серверов в библиотеке предусмотрены средства демонстрации их COM-объектов.

2. Генерировать уникальный идентификатор объекта, осуществлять поиск требуемого объекта по его идентификатору.

3. Производить вызов удаленных процедур, если сервер COM размещен на другом компьютере.

4. Управлять распределением памяти в интересах взаимодействующих процессов и контролировать освобождение памяти.

По существующей договоренности имена всех методов Win32 API библиотеки COM начинаются с префикса «Co», например CoCreateGuid(), CoCreateInstance(), CoUn- initialize() и т. п.

4.3.1.2. Элементы COM-приложения

Разработчик стандартного COM-приложения в любом случае столкнется с двумя его элементами:

- сервер COM

- клиент COM.

Сервер COM представляет собой отдельный модуль, реализованный в виде самостоятельного исполняемого EXE-файла или файла динамической библиотеки DLL.

Моделью COM предусмотрены две разновидности сервера: внутренний и внешний.

Внутренний сервер COM трудится в том же адресном пространстве, что и клиентское приложение. Для этого сервер реализуется в динамически подключаемых библиотеках и вызывается клиентом COM в нужный момент.

В отличие от внутреннего сервера, внешний COM-сервер выполняется в своем собственном адресном пространстве. Допускается, чтобы внешний сервер порождался процессом, выполняющимся на другом компьютере. В этом случае вернее говорить не просто о COM, а о распределенной COM (Distributed COM, DCOM). При этом передача вызовов между двумя машинами осуществляется с помощью механизма удаленного вызова процедур RPC (Remote Procedure Call).

Рассмотрим классы VCL, поставленные на службу технологии COM.

В состав COM-сервера как минимум входят:

1. Один - единственный экземпляр класса TcomServer, инкапсулирующий сам COM-сервер. Доступ к этому объекту обеспечивает создаваемая при запуске сервера глобальная переменная ComServer.

2. Описание COM-объекта (или нескольких объектов), прототипом которого служит класс TComObject.

3.Фабрика класса (по одной на каждый тип COM-объекта). Основой фабрики класса служит класс TComObjectFactory. Единственная задача фабрики класса заключается в создании других объектов – экземпляров класса TComObject.

С выходом очередной версии библиотеки не надо обновлять все свое программное обеспечение.

В COM-модели процессом создания нового объекта ведает не среда программирования и даже не сам объект, а третья (в какой-то степени нейтральная) сторона – фабрика класса (class factories). Именно фабрика целиком и полностью отвечает за распределение памяти для будущего COM-объекта, и при этом, как бы это нам не показалось парадоксальным, о подробностях построения этого объекта не имеет ни малейшего представления.

Для каждого отдельного COM-класса предназначена отдельная фабрика.

Для создания нового экземпляра класса фабрика пользуется шаблоном класса, или фабричным образцом (factory pattern).

Фабричный образец - это особый класс, применяемый для создания экземпляра другого класса.

Благодаря «фабричному» подходу процесс создания нового объекта отделяется от особенностей его реализации.

Обслуживанием фабрик ведает менеджер фабрик - объект класса TComClass - Manager. Экземпляр менеджера создается автоматически и доступен в приложении COM - сервера благодаря глобальной переменной ComClassManager.

Клиент COM пользуется услугами сервера, но не имеет ни малейшего понятия об особенностях его реализации. Доступ клиента к службам внедренного в сервер COM-объекта осуществляется только через интерфейсы этого объекта; это ключевая особенность всей COM-модели. Получив указатель на интерфейс, клиентское приложение приобретает право вызова методов объекта.

4.3.1.3. COM – объект

В основе многокомпонентной модели лежит понятие COM-объекта.

Физически COM-объект представляет собой совокупность данных и методов, управляющих этими данными. Структура COM-объекта существенно отличается от кнопок и строк ввода, привычных нам по библиотеке VCL. Ключевое отличие COM от знакомого нам объекта Delphi в том, каким образом COM-объект предоставляет доступ к своим данным.

Структура COM-объекта материализует идею сказки о Кощее Бессмертном. Помните: смерть в игле, игла в яйце, яйцо в утке, утка в зайце, заяц в сундуке, сундук на дубе... Неизвестно, читали в Microsoft русские народные сказки или нет, но проектируя COM-объект, программисты корпорации уверенно пошли по проторенному Кощеем пути - прямого доступа к данным COM- объекта извне в принципе не существует. Каждое поле объекта скрыто в его недрах и может обслуживаться только методами COM-объекта. Методы объекта также особой коммуникабельностью не отличаются; они упакованы так глубоко, что доступны лишь через свои указатели.

Рис. 6. Модель COM-объекта

И это еще не все. В свою очередь указатели на методы хранятся в специальных таблицах адресов функций - в так называемых виртуальных таблицах объекта (virtual tables). Описание каждой из таких таблиц называют интерфейсом (interface). Методы интерфейса можно вызывать аналогично методам любого объекта Delphi.

Сколько у объекта таблиц, столько у него интерфейсов. В свете вышесказанного не стоит удивляться, что непосредственно к интерфейсу (указателю на виртуальную таблицу адресов методов) обратиться нельзя - вместо этого можно работать лишь с указателем на интерфейс; это единственное, что доступно извне COM-объекта. На рис. 6 представлена модель COM-объекта.

Получив доступ к обязательно присутствующему интерфейсу IUnknown, программа или любой другой объект сразу может обратиться к функции QueryInterface() и узнать обо всех остальных имеющихся у этого объекта интерфейсах. На схемах интерфейс IUnknown изображается в верхней части объекта (рис. 7).

Рис. 7. Представление COM-объекта в виде схемы

В среде программирования Delphi в основу COM-объекта положен класс TCOMObject. Его интерфейсная часть создается на базе опорного для всех интерфейсных классов IInterface.

4.3.1.4. Интерфейс

По своей сути интерфейс - это договор между COM-объектом и клиентским приложением, в котором COM-объект гарантирует клиенту предоставление некоторых услуг. Услуги - это определенные в интерфейсе методы. Но хотя интерфейс и имеет право объявлять заголовки методов, но ни один из его методов не имеет описания. Это объясняется тем, что у интерфейса нет раздела реализации, он лишь декларирует названия методов и перечень параметров. Клиенты могут получить доступ к данным COM-объекта только с помощью указателя на интерфейс.

Другим значимым аспектом интерфейса является то, что если COM-объект заявляет о существовании у него определенного интерфейса, то объявленный интерфейс должен обязательно поддерживаться внутренними методами объекта и возвращать какие-либо значения, пусть хотя бы банальное сообщение об ошибке.

Интерфейсы могут наследоваться - дочерний интерфейс должен включать все методы своего предка. Все существующие интерфейсы наследуются от базового интерфейса IUnknown.

Следует указать еще на два правила, соблюдение которых необходимо при проектировании COM-объекта:

Единожды опубликованный интерфейс не может быть изменен. При необходимости дополнить существующий интерфейс новыми функциональными возможностями следует создать новый интерфейс. Выполнение этого правила гарантирует, что запрашивающее конкретный интерфейс клиентское приложение получит именно то, на что оно рассчитывает.

В рамках отдельной системы каждый интерфейс должен иметь уникальный идентификатор GUID и название, начинающееся с символа «I».

4.3.1.5. Порядок вызова сервера клиентским приложением

Для того чтобы модель COM начала функционировать, клиентское приложение должно отправить запрос на услуги COM-сервера. Каким образом клиентское приложение получит доступ к интересующему его COM-серверу? В особенности если COM-клиент работает в другом адресном пространстве? Ответ на эти вопросы надо искать в системном реестре Windows.

ё

Рис. 8. Порядок обращения клиента к серверу

Во время установки COM-приложения в реестр операционной системы вносится информация об имеющихся в наличии COM-объектах. В первую очередь это идентификатор, однозначно определяющий класс объекта (Class Identifier, CLSID). Идентификаторы классов хранятся в следующей ветви реестра Windows:

HKEY_LOCAL_MACHINE\SOFTWARE\Имя_клacca\CLSID\

Аналогичные данные можно найти и в ветви HKEY_CLASSES_ROOT. Кроме того, в реестре хранится имя модуля, содержащего сервер, или сетевой адрес, если сервер выполняется на другой машине.

Идентификатор CLSID - это разновидность уже встречавшихся ранее глобальных уникальных идентификаторов (Global Unique Identifier, GUID). Это уникальное 128- битное число, применяемое для идентификации интерфейсов, объектов и классов. Уникальность достигается за счет использования оригинального алгоритма генерации числа, обеспечиваемого функцией Win32 API CoCreateGuid().

В процессе запуска COM-объекта непосредственное участие принимает системная библиотека COM. На рис. 8 схематично представлена последовательность действий клиента, библиотеки и сервера COM при создании первого экземпляра COM-объекта.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: