Архитектура СОМ
(Продолжительность занятия 15 минут)
Модель многокомпонентных объектов (Component Object Model, СОМ) позволяет определить стандарт взаимодействия между объектами-приложениями и объектами-компонентами (например, Microsoft Word или приложение на Visual Basic), a также совместно использовать данные. Объекты взаимодействуют через интерфейсы СОМ.
На этом занятии Вы узнаете
об архитектуре СОМ и роли интерфейсов во взаимодействии объектов СОМ. Кроме
того, познакомитесь с распределенной моделью СОМ (Distributed СОМ, DCOM), обеспечивающей
взаимодействие объектов в сетевой среде.
Изучив материал этого занятия,
Вы сможете:
- охарактеризовать архитектуру COM;
- описать связь между объектами через интерфейсы COM;
- объяснить, как интерфейс IUnknown управляет другими интерфейсами объекта;
- описать DCOM;
Характеристики СОМ
Объекты СОМ проектируют и конструируют на основе двоичного стандарта, который описывает структуру, обеспечивающую взаимодействия приложений или других компонентов. До тех пор пока объекты — приложения и компоненты — опираются на двоичный стандарт СОМ, они могут взаимодействовать друг с другом независимо от того, на каком языке или какими средствами разработки они созданы.
Языковая независимость
Поскольку объекты СОМ должны соответствовать двоичному интерфейсу, разработчики могут пользоваться любым языком программирования, поддерживающим этот интерфейс. Клиентский объект-приложение или объект-компонент не задумываются о языке, на котором написан объект СОМ, а только о том, можно ли связаться с ним через стандартный двоичный интерфейс.
Технология СОМ произвела настоящую революцию в разработке программ — особенно в создании многокомпонентного программного обеспечения, — не требуя изменений в архитектуре сетей, аппаратном обеспечении и средствах программирования.
Взаимодействие приложений
СОМ обеспечивает взаимодействие приложений, написанных на разных языках. Например, редактор текстов одного производителя может связаться с объектом «электронная таблица» другого разработчика, а затем — даже импортировать из него данные. Кроме того, электронная таблица может принимать данные через объект СОМ, расположенный на мэйнфрейме (рис. 5.1).
Рис. 5.1 Средства СОМ
Пока объекты поддерживают стандартные интерфейсы при обмене данными, редактор текстов, электронная таблица и база данных на мэйнфрейме могут не иметь информации о фактической реализации друг друга. Редактору текстов требуется лишь знать, как связаться с электронной таблицей; а той — как предоставить свои сервисы любому, кто хочет связаться с ней.
Примечание Технологии
связывания и внедрения объектов (Object Linking and Embedding, OLE) и ActiveX
основаны на СОМ. Хотя термин ActiveX все чаще употребляют вместо OLE, последний
по-прежнему применяется в отношении отдельных реализаций, например структурированных
хранилищ OLE (OLE Structured Storage) и OLE-автоматизации (OLE Automation).
Объекты СОМ
Ненадолго прервите чтение, запустите видеоролик Chap05.exe с прилагаемого к книге компакт-диска: в нем объясняется разница между объектами, создаваемыми в объектно-ориентированных языках программирования, и объектами СОМ.
Объекты СОМ — это повторно используемые программные компоненты, которые разработаны специально для вызова из других приложений. Ранее объекты, созданные в объектно-ориентированных языках программирования (ООП), можно было повторно применять только в том же самом языке. Технология СОМ позволяет инкапсулировать объекты ООП в повторно используемые динамические библиотеки (DLL), ActiveX-элементы (ОСХ) или исполняемые файлы для работы в разных приложениях и языках программирования. Например, компонент, созданный в Visual C++, Вы легко и просто вставите в приложение, написанное на Visual Basic.
Структура и иерархия объектов
СОМ описывает не структуру объектов, а их взаимодействие. Внутреннюю структуру компонента определяют язык программирования и среда разработки, которая, однако, не устанавливает стандарты на работу с объектами за пределами приложения. Благодаря языково-независимым интерфейсам, СОМ действует там, где языки программирования уже не способны предоставить необходимые возможности взаимодействия приложений и компонентов.
Предоставление сервисов
Объекты СОМ предоставляют свои сервисы клиентам — любой части кода (не обязательно приложению), которая использует сервисы объекта. Серверный объект — это часть кода, которая предоставляет сервисы клиенту. Доступ к сервисам осуществляется через интерфейсы СОМ, которые вызываются объектами-клиентами.
Сервисы реализуют два основных типа объектов СОМ: внутрипроцессные (in-process) и внешние (out-of-process). Первые — это библиотеки динамической загрузки, которые всегда выполняются локально. Вторые представляют собой исполняемые модули и могут работать как на локальном, так и на удаленном компьютере.
Интерфейсы СОМ
Возможности объектов СОМ доступны через интерфейс. Он представляет собой указатель (адрес памяти) на функции, вызываемые клиентом. Такое взаимодействие между пользователем сервисов объекта — клиентом — и сервером, реализующим объект и его сервисы, называется контрактом. Сервисы имеют и другое название — методы, или функции-члены. Контрактом между программными компонентами определяется:
- уникальный идентификатор интерфейса, отличающий его от других;
- местоположение функций в интерфейсе;
- назначение функций;
- аргументы и возвращаемые значения каждой функции.
Контракт не обязан указывать:
- способ реализации функции;
- код, составляющий функцию;
- язык, использованный для создания объекта;
- платформу, на которой выполняется объект.
Интерфейс не является ни объектом, ни классом (определением) объектов. Интерфейс — это абстрактный класс, который нужно проектировать исходя из возможного применения в самых разных контекстах. Например, простой интерфейс базового чтения-записи потоков данных подойдет для множества самых разных клиентов и типов объектов.
Интерфейс IUnknown
Объект СОМ имеет несколько интерфейсов, что позволяет обслуживать клиентов разных типов. Тем не менее все объекты СОМ поддерживают как минимум один стандартный интерфейс — I Unknown, который управляет всеми другими интерфейсами объекта. Этот интерфейс имеет три основных метода: AddRef, Release и Querylnterface (рис. 5.2).
Рис. 5.2 Интерфейс lUnknown
- Метод AddRef реализует объект СОМ. При создании каждого экземпляра объекта значение счетчика ссылок для него увеличивается. В Visual Basic метод AddRef вызывается при использовании функции CreateObject.
- Метод Release применяется для уничтожения объекта и уменьшения значения счетчика ссылок. В Visual Basic это делают, присваивая объекту значение Nothing.
- Метод Querylnterface предоставляет список интерфейсов, поддерживаемых объектом. Например, объект СОМ может иметь разные интерфейсы для работника и для менеджера (lEmployee и IManager). Если клиент содержит объектную переменную, которая указывает на достоверный интерфейс СОМ, он вправе, используя этот метод, запросить любой интерфейс, предоставляемый объектом. Visual Basic предоставляет такую возможность автоматически средствами оператора Set.
Пример Здесь на Visual
Basic выполняются методы AddRef и Release для объекта СОМ:
'Вызов метода AddRef
Set MyObject = CreateObject('Word.Application")
'Вызов метода Release
Set MyObject = Nothing
Интерфейс IDispatch
IDispatch — это интерфейс автоматизации для контроллеров, не использующих интерфейсы СОМ напрямую. Исполняемый файл или DLL, использующие I Dispatch, называют серверами автоматизации. При доступе к объекту через интерфейс IDispatch применяется отложенное связывание — реальный доступ происходит во время выполнения. IDispatch поддерживает следующие основные методы.
- GetIDsOfNames — отображает имя одного члена класса и, по желанию, набор имен аргументов в соответствующий набор целых идентификаторов связи (Dispatch Identifier, DISPID), которые затем можно использовать в вызовах метода Invoke.
- GetTypeInfo — извлекает информацию о типах объекта.
- GetTypeInfoCount — извлекает информацию о типах, предоставляемых объектом (возвращает 0, если информации о типах нет, и 1 — если есть).
- Invoke — предоставляет доступ к свойствам и методам объекта.
Во время выполнения клиент передает строку с именем свойства (или метода), которое он хочет вызвать, методу IDispatch.GetIDsOfNames. Если данное свойство (или метод) объекта существует, клиент получает идентификатор соответствующей функции. Затем его можно использовать для фактического вызова свойства (или метода) средствами метода IDispatch.Invoke. Методы GetTypeInfoCount и GetTypeInfo позволяют получать из библиотеки типов компонента информацию об интерфейсах, методах и свойствах, которые он поддерживает.
Пример В этом коде на
Visual Basic функция CreateObject применяется в операторе Set для
создания нового объекта, который использует отложенное связывание и интерфейс
IDispatch.
Dim MyObject as Object
Set MyObject = CreateObject("Word.Application")
Применение общей объектной переменной обеспечивает отложенное связывание — Вы можете использовать одну и ту же переменную для различных объектов и для объектов, которые поддерживают только отложенное связывание.
Виртуальные таблицы
Автоматизация позволяет ActiveX-клиенту вызывать метод или свойство напрямую. Этот способ, не использующий интерфейс IDispatch, называется связыванием через виртуальную таблицу. В Visual Basic применение виртуальной таблицы именуют ранним связыванием. Для него необходима информации о типах в виде библиотеки типов. Клиент получает эти данные на стадии компиляции, проверяет типы и синтаксис и затем вызывает методы и функции напрямую. На стадии выполнения раннее связывание работает гораздо быстрее, поскольку местонахождение сервера автоматизации уже известно, типы данных и синтаксис проверены, а доступ осуществляется непосредственно, без вызова IDispatch.
Для ссылки на экземпляры интерфейсов клиенты используют указатели, получая их во время создания объекта или запрашивая объект. Определив интерфейс, Вы
задаете массив указателей на функции, известный как виртуальная таблица (Virtual Table, VTBL). Функции, на которые указывают члены VTBL, называются методами, или функциями-членами интерфейса. Общепринято имена интерфейсов начинать с буквы «I».
Рис. 5.3 Применение виртуальных таблиц
Виртуальная таблица содержит список адресов всех свойств и методов, включенных в объект, в том числе функции-членов поддерживаемых им интерфейсов (рис. 5.3). Первые три члена VTBL — из состава интерфейса I Unknown, а последующие относятся к другим поддерживаемым интерфейсам — например, ряд полезных интерфейсов предоставляет OLE (их имена обычно начинаются с 101е). Любой человек, например Вы, вправе определить свои интерфейсы по мере разработки компонентов приложения.
Глобально-уникальные идентификаторы
Для идентификации интерфейсов и классов компонентов СОМ использует уникальные идентификаторы (Global Unique Identifier, GU1D) — 128-разрядные целые числа, которые гарантированно неповторимы. Имена интерфейсам и классам присваиваются только для удобства, и они достоверны лишь на компьютере, где хранится компонент. Применение уникальных идентификаторов обезопасит Вас от случайного вызова не того элемента, интерфейса или метода даже в сети с миллионами компонентов (рис. 5.4).
CLSID и IID
Каждый созданный Вами компонент
должен иметь уникальный GUID-иденти-фикатор, называемый идентификатором класса
(Class Identifier, CLSID); он позволяет ссылаться на компонент. Точно так же
каждому интерфейсу Вашего компонента необходимо присвоить персональный GUID-идентификатор
— идентификатор интерфейса (Interface Identifier, IID).
Рис. 5.4 Идентификация компонентов
Строка идентификатора класса хранится в ключе реестра
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID
DСOM
Распределенная модель многокомпонентных объектов (Distributed Component Object Model, DCOM) — это протокол, обеспечивающий гибкое, защищенное и эффективное взаимодействие программных компонентов в сетевой среде (рис. 5.5).
Рис. 5.5 Границы процессов в распределенной модели СОМ
Прежнее название DCOM — Network OLE. Эта спецификация разработана для применения поверх самых разных сетевых транспортов. DCOM основана на спецификации DCE-RPC фонда открытого программного обеспечения (Open Software Foundation, OSF) и, благодаря использованию технологии СОМ, поддерживает Java-апплеты и ActiveX-компоненты. Например, можно средствами Java создать апплет, который вычисляет стоимость портфеля ценных бумаг на основе текущих котировок, отслеживаемых в режиме реального времени через Интернет средствами DCOM.
Когда клиент и компонент хранятся на разных машинах, DCOM просто заменяет локальный механизм взаимодействия процессов сетевым протоколом. Ни клиент, ни компонент не знают о том, что соединение между ними стало гораздо длиннее.
Диспетчер соединений удаленной автоматизации
Уровень управления доступом для сетевого компьютера устанавливают и с помощью диспетчера соединений удаленной автоматизации (Remote Automation Connection Manager, RACMAN). Для реализации стратегии защиты диспетчер соединений необходимо установить и запустить на удаленном компьютере. Диспетчер соединений, поставляемый в составе Visual Basic 5.0 Enterprise Edition, используют и для соединения с источниками СОМ через удаленную автоматизацию или DCOM.
Вкладка Client Access окна диспетчера соединений позволяет выбрать значение уровня защиты для удаленного компьютера. Возможные варианты перечислены во второй колонке приведенной ниже таблицы.
Имя |
Значение |
Описание |
Disallow All Remote |
0 |
Не позволяет создавать какие-либо объекты |
Allow Remote Creates by Key |
2
|
Объект будет создан, только если установлен флажок Allow Remote Activation. В результате идентификатор класса компонента (CLSID) в реестре Windows дополняется параметром AllowRemoteActivation=Y |
Allow Remote Creates By ACL |
3 |
Объект может создать только пользователь, имя которого занесено в список контроля доступа (Access Control List, ACL), заданный в реестре Windows для данного класса (только для Windows NT) |
Allow All Remote Creates |
1 |
Разрешает создавать любые объекты |
Резюме
Модель многокомпонентных объектов (Component Object Model, СОМ) определяет стандарт взаимодействия между объектами-приложениями и объектами-компонентами (такими, как Microsoft Word или приложение на Visual Basic) и совместного использования данных. Языковая независимость СОМ позволяет использовать объекты повторно в различных приложениях и программных средствах. Взаимодействие компонентов осуществляется средствами стандартных или специализированных интерфейсов СОМ. Интерфейс — это контракт между двумя объектами, который фиксирует:
- уникальный идентификатор интерфейса, отличающий его от других;
- местоположение функций в интерфейсе;
- назначение функций;
- аргументы и возвращаемые значения каждой функции.
Все объекты СОМ должны поддерживать как минимум один стандартный интерфейс — IUnknown, который управляет всеми другими интерфейсами объекта. Доступ к членам или функциям объекта СОМ можно получить через интерфейс IDispatch или виртуальную таблицу функций (VTBL).
СОМ использует глобально-уникальные идентификаторы (GUID) для определения всех интерфейсов и компонентных классов.
Распределенная модель многокомпонентных объектов (DCOM) — это протокол, обеспечивающий гибкое, защищенное и эффективное взаимодействие программных компонентов в сетевой среде.