Объектная модель компонентов (COM) Модель COM. Создание COM объекта. Повторное применение СОМ объектов. Маршалинг. IDL. Перманентность.

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

В СОМ любая часть программного обеспечения реализует свои сервисы как один или несколько объектов СОМ.

Каждый такой объект поддерживает один или несколько интерфейсов, состоящих из методов.

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

Клиенты получают доступ к сервисам объекта СОМ только через вызовы методов интерфейсов объекта — у них нет непосредственного доступа к данным объекта.

Объект COM может поддерживать более одного интерфейса, например, объект COM, показанный на рис. 4.3, имеет три интерфейса.

Рис. 4.3. Пример объекта COM

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

Рассмотрим пример. Допустим разработчиками был создан объект COM, для реализации проверки правописания, единственный интерфейс ISpeller, который кроме стандартных содержит три метода: FindWord ( ); AddWord ( ), RemoveWord ( ). которые позволяют находить слово в словаре, добавлять слово в словарь и удалять слово из словаря, соответственно.

Если позднее появляется идея расширить функциональные возможности объект COM за счет включения функции поиска синонимов, то, поскольку интерфейс нельзя изменять, то можно создать новый интерфейс, который можно назвать, например, IThesaur, который помимо 3-х стандартных методов содержит единственный метод GetSynonym ( ).

Интерфейсы СОМ.Каждый поддерживаемый объектом интерфейс, по сути контракт между этим объектом и его клиентами, в соответствии с которым объект должен поддерживать методы интерфейса в соответствии со спецификайией, а клиент обязуется корректно вызывать методы.

Интерфейс СОМ также включает в себя набор функций, которые реализуются компонентами и используются клиентами. Но СОМ дает более точное определение интерфейса. В СОМ интерфейсом является определенная структура в памяти, содержащая массив указателей на функции. Каждый элемент массива содержит адрес функции, реализуемой компонентом. Для клиента компонент представляет собой набор интерфейсов. Клиент может взаимодействовать с компонентом СОМ только через интерфейс.

Идентификация интерфейса.У каждого интерфейса СОМ имеется два имени. Одно из них предназначено для использования человеком, а второе – для использования ПО.

Первое имя представляет собой строку символов, например ISpeller. По соглашению читабельные имена большинства СОМ-интерфейсов начинаются с буквы I (от interface).

Второе имя – машинное имя, которое представляет собой идентификатор интерфейса IID, имеющий длиной 128 битов (16 байтов), который называют также GUID (Globally Unique IDentifier - глобально уникальный идентификатор).

Этот идентификатор уникален во времени и в пространстве. Идентификатор можно сформировань самостоятельно с помощью утилиты. Он состоит из 2-х частей. Первая часть (48 бит) – это обычно номер сетевой карты хоста, на котором работает утилита, а вторая часть – это текущее значение системых часов. Если в машине отсутствует сетевая карта, то MAC адрес заменяется случайным числом.

Интерфейс IUnknown.Каждый объект СОМ должен поддерживать интерфейс IUnknown, иначе он не будет объектом COM. Интерфейс IUnknown включает три метода: QueryInterface, AddRef и Release. Все интерфейсы наследуют от IUnknown, его методы можно вызывать вызваны через любой из указателей на интерфейс. Обычно первый указатель на интерфейс объекта клиент получает при создании объекта. Затем клиент может получить ссылку на требуемый интерфейс, запросив у объекта указатели с помощью IUnknown::Querylnterface.

Поскольку все интерфейсы СОМ наследуют IUnknown, в каждом интерфейсе есть функции QueryInterface, AddRef и Release.

Внутри COM объекта имеется виртуальная таблица (рис. 4.4), которая содержит указатели на реализуемые методы. Первые три строчки – это указатели на QueryInterface, AddRef и Release.

Метод QueryInterface.При помощи QueryInterface клиент определяет, поддерживается ли тот или иной интерфейс. Метод QueryInterface использует в качестве аргумента (Interface Identifier - IID) GUID), и возвращает указатель на определенный интерфейс.

Рис. 4.4. Виртуальная таблица COM объекта

Подсчет ссылок AddRef и Release.Пара функций AddRef и Release реализуют технику управления памятью, основанную на подсчете ссылок (reference counting). Подсчет ссылок - простой и быстрый способ, позволяющий управлять жизненным циклом компонента. Компонент СОМ поддерживает счетчик ссылок. Механизм очень прост. Когда клиент получает в свое распоряжение некоторый интерфейс, значение этого счетчика увеличивается на единицу. Когда клиент заканчивает работу с интерфейсом, значение на единицу уменьшается. Когда оно доходит до нуля, компонент удаляет себя из памяти. Клиент также увеличивает счетчик ссылок, когда создает новую ссылку на уже имеющийся у него интерфейс. Внутри функции незачем подсчитывать ссылки для указателей на интерфейсы, хранящиеся в локальных переменных. Однако подсчет ссылок необходим при всяком копировании указателя в глобальную переменную или из нее - глобальная переменная может освободиться в любой момент и в любой функции. С точки зрения клиентов подсчет ссылок осуществляется для интерфейсов, а не для компонентов, для реализации компонента это не имеет значения. Компонент может поддерживать отдельные счетчики для каждого из интерфейсов, а может иметь один общий счетчик. Реализация не имеет значения до тех пор, пока клиент убежден, что подсчет ссылок ведется для самих интерфейсов. Поскольку компонент может реализовывать подсчет для каждого интерфейса, клиент не должен предполагать обратного. Подсчет ссылок для каждого интерфейса в отдельности означает, что клиент должен вызывать AddRef именно для того указателя, с которым собирается работать, а не для какого-нибудь другого. Клиент также должен вызывать Release именно для того указателя, с которым закончил работу. Если клиент не вызвал функцию Release для некоторого из интерфейсов компонента, то компонент будет продолжать занимать память. Еще более неприятная ситуация возникает в случае, если клиент, например, дважды вызовет функцию Release, поскольку в этом случае объект будет уничтожен досрочно.

Допустимо существование в любой данный момент времени одного, двух или многих активных объектов одного класса.

Серверы объектов СОМ.Каждый объект СОМ реализуется внутри некоторого сервера.

Один сервер может поддерживать несколько классов. Выделяются следующие типа серверов:

- сервер «в процессе», который реализуется в виде в динамической библиотеке (.dll), т.е. исполняется в одном адресном пространстве с клиентом;

- локальный сервер, в котором объекты реализованы в отдельном процессе (.exe файл), исполняющемся на том же хосте, что и клиент;

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

Доступ к методам объектов во всех случаях осуществляет через указатели интерфейсов.

Создание объектов СОМ. Библиотека СОМ.Клиент может получить указатель на один один из интерфейсов разными способами. Например, указатель может быть передан другим клиентом, либо клиент может получить его от моникера. (Моникеры будут рассмотрены ниже).

В любой системе, поддерживающей СОМ, должна иметься реализация библиотеки СОМ, которая предоставляет клиентам механизм запуска серверов объектов. Доступ к сервисам библиотеки СОМ осуществляется через вызовы обычных функций, а не методов интерфейсов СОМ-объектов. Обычно имена функций библиотеки СОМ начинаются с "Со" — например, CoCreatelnstance.

Создание одного объекта.Самый простой способ создания одного неинициализированного экземпляра объекта показан на рис. 4.5.

Рис. 4.5. Способ создания одного неинициализированного экземпляра объекта








Дата добавления: 2018-09-24; просмотров: 601;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.007 сек.