Russian Belarusian English German Japanese Ukrainian

4.235

Технология COM (Component Object Model - компонентная модель объектов) предоставляет возможность одной программе (клиенту) работать с объектом другой программы (Сервера). СОМ - это модель объекта, которая предусматривает полную совместимость во взаимодействии между компонентами, написанными разными компаниями и на разных языках. При этом неважно, где выполняются программы: в одном потоке, в разных потоках, на разных компьютерах.

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

Объект является частью сервера СОМ. Сервером может быть исполняемый файл или библиотека DLL. При установке сервера в Windows в системный реестр заносится информация о всех его объектах. Эта информация включает в себя идентификатор класса CLSID (Class Identifier), однозначно определяющий класс объекта. Заносится информация о типе сервера: внутренний (in-process - внутри процесса) - DLL, подключающаяся к клиенту, локальный (local) - работающий отдельным процессом на компьютере клиента, удаленный (remote) - работающий на удаленном компьютере. Для внутренних и локальных серверов в реестр заносится полное имя файла, а для удаленных - полный сетевой адрес. Таким образом, в системе хранится вся информация о сервере СОМ, необходимая для вызова его в нужный момент.

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

Локальный или удаленный сервер - это автономный исполняемый файл, экспортирующий автоматные объекты. Примером этого мог бы быть Microsoft Word. Word имеет некоторое количество объектов, которые он экспонирует в качестве автоматных.

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

Таким образом, клиенту достаточно знать интерфейсы объекта и предоставляемые ими методы. Об остальном позаботится система. В нужный момент она запустит сервер СОМ, если он еще не был запущен, сервер создаст объект, объект загрузит все необходимые ему данные и клиенту вернутся указатели на объект и его интерфейсы, с которыми он может работать. Система позаботится также о том, чтобы обеспечить работу объекта сразу с несколькими клиентами. Для этого она ведет учет числа ссылок на объект. При выдаче клиенту указателя на интерфейс число ссылок увеличивается на 1. А при окончании работы клиента с объектом число ссылок на 1 уменьшается. Если число ссылок стало равно нулю, система уничтожает объект, с которым в данное время не работает ни один клиент.

Все хорошо, но откуда разработчик клиентского приложения может получить информацию об объектах СОМ, их интерфейсах, свойствах, методах, параметрах методов? Вся эта информация содержится в библиотеке типов, которая создается разработчиком объекта СОМ и распространяется вместе с объектом. Библиотека создается с помощью языка описания интерфейса IDL (Interface Definition Language).

Каждый интерфейс имеет имя, начинающееся с символа «I», и GUID - глобальный уникальный идентификатор (Globally Unique Identifier). Подобные GUID создаются и используются не только для интерфейсов. Для интерфейсов GUID называется IID. Каждый объект СОМ имеет интерфейс IUnknown. Этот интерфейс имеет всего три метода: Querylnterface - получение указателя на интерфейс, AddRef и Release - увеличение и уменьшение на 1 числа ссылок на объект. Метод Querylnterface возвращает указатель на интерфейс с заданным IID. Метод Release должен вызываться по окончании работы с интерфейсом, чтобы уведомить объект, что данный клиент в нем более не нуждается. Эти два метода используются всегда при работе с объектом СОМ. Еще один метод - AddRef используется только в тех случаях, когда один клиент передал другому ссылку на интерфейс. Поскольку при этом метод AddRef, автоматически увеличивающий число ссылок, не вызывается, клиент, которому передана ссылка, должен вызвать AddRef, чтобы доложить объекту, что он тоже с ним работает.

Технология СОМ реализуется специальными библиотеками, включая OLE32.dll и OLEAut32.dll. Они содержат стандартные интерфейсы API с функциями, обеспечивающими создание объектов СОМ и управление ими.

Так как технология СОМ не зависит от языка, в ней используются типы, отличные от других языков. Прежде всего, это относится к строкам, которые в разных языках описываются по-разному. В СОМ используется свой строковый тип - BSTR (Basic STRing). Он описывает строку, в начале которой указана ее длина. Поскольку длина строки известна, завершающего нулевого символа не требуется.

Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Добавить комментарий


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