Архитектура Microsoft Windows для разработчиков

         

Архитектура компонентных решений


Глава 5. Архитектура компонентных решений

Прежде всего Для изучения занятий этой главы необходимы:

Microsoft Visual Basic 5.0;

Microsoft Word 97;

звуковая карта и колонки или наушники для прослушивания мультимедиа-файлов;

мультимедиа-файл Chap05.exe.

Занятие 1. Архитектура СОМ

Занятие 2. Реализация СОМ

Занятие 3. Связывание и внедрение объектов

Закрепление материала



Закрепление материала


Закрепление материала

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

Чем различаются объект СОМ и объект, созданный из обычного класса C++?

ответ

В чем различие между объектом-клиентом и объектом-сервером?

ответ

Что такое интерфейс?

ответ

Для чего используется метод Release интерфейса lUnknown? Как этот метод реализация в Visual Basic?

ответ

Как обычно реализуется внутрипроцессный сервер? Внешний сервер?

ответ



Архитектура СОМ


Занятие 1. Архитектура СОМ

(Продолжительность занятия 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) — это протокол, обеспечивающий гибкое, защищенное и эффективное взаимодействие программных компонентов в сетевой среде.

Реализация СОМ


Занятие 2. Реализация СОМ

(Продолжительность занятия 15 минут)

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

Изучив материал этого занятия, Вы сможете:

описать регистрацию компонентов в библиотеке COM;

объяснить важность контроля версий для технологии компонентов;

описать, как объекты COM взаимодействуют между собой.

Библиотека СОМ

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

Рис. 5.6 Библиотека СОМ

Взаимодействие процессов

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

Контроль версий компонентов

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

Поддержка эволюции компонентов

СОМ решает проблему контроля версий, обеспечивая возможность эволюции компонентов.
Существующие клиенты при изменении серверных объектов остаются совместимыми — средства СОМ обеспечивают поддержку как новых, так и старых интерфейсов. На стадии выполнения старые и новые клиенты безопасно сосуществуют с серверным компонентом СОМ. Ошибки возможны только во время связывания и вызова Query Interface, однако они легко поддаются обработке. СОМ гарантирует, что не случится ошибки, вызванной отсутствием ожидаемого метода или изменением параметров его вызова. Обратная совместимость Visual Basic реализует обратную совместимость путем сохранения информации об идентификаторах класса или интерфейса предыдущих версий компонента. Если Вы создаете новую версию компонента в Visual Basic, применяя режим Binary Compatibility, она сможет работать со старыми клиентами. При этом клиентские приложения, откомпилированные с ней, будут пользоваться новыми функциями, поскольку при их компиляции задействованы новые идентификаторы класса и интерфейса. И пока сохраняется двоичная совместимость, клиенты с отложенным связыванием смогут работать с Вашим компонентом. Добавление новых интерфейсов Обновление программного модуля — это обычно добавление каких-либо функций или модернизация существующих. Компонент СОМ приобретает новые возможности за счет поддержки последних версий интерфейсов. Поскольку существующие интерфейсы при этом не меняются, компоненты, использующие их, будут работать по-прежнему. Новые же компоненты смогут воспользоваться новыми интерфейсами. Поскольку при применении раннего связывания вызывается метод Query Interface интерфейса lUnknown, текущие возможности компонента СОМ можно выяснить при каждом его использовании. Этот механизм обеспечивает новым клиентам немедленный доступ к появившимся возможностям компонента. Механизм контроля версий Механизм контроля версий считают удачным, если он позволяет обновить один системный компонент без обновления других. Приложения могут создавать экземпляры Ваших классов, используя функцию CreateObject и программный идентификатор, как это показано ниже.


Пример Функция CreateObject находит идентификатор класса в реестре Windows и использует его для создания объекта, гарантируя тем самым создание самой последней версии. Dim X As Object
Set X = CreateObject("MyComponent. MyObject")
Взаимодействие между объектами
СОМ позволяет клиентам связываться с объектами независимо от того, где они выполняются: в том же самом процессе, на том же компьютере или на другом компьютере сети (рис. 5.7). Таким образом обеспечивается единая программная модель для объектов-клиентов и объектов-серверов.


Рис. 5.7 Взаимодействие между процессами
Стандартный маршалинг
Маршалинг (marshaling) — это упаковка всех параметров и возвращаемых значений и передача их через границы процессов. СОМ поддерживает так называемый стандартный маршалинг, который надежно работает для большинства объектов, значительно снижая требования к программной реализации и делая процесс мар-шалинга полностью прозрачным.
Произвольный маршалинг
Стандартный маршалинг есть не что иное, как частный случай произвольного мар-шалинга (custom marshaling). Вы можете реализовать свой вариант маршалинга, если нужно, чтобы объект выполнял один набор действий при сетевом доступе и другой — при локальном, эффективно маскируя это различие от клиента. Такая архитектура позволяет проектировать интерфейсы клиент-объект, не заботясь о производительности сети — эти вопросы можно решить позднее, без изменения разработанной инфраструктуры приложения.
Связь с клиентом
До некоторого момента все вызовы серверных функций клиентом являются внутри-процессными, однако рано или поздно возникает необходимость выхода за границы процесса. Поскольку виртуальные таблицы позволяют агенту (например, СОМ) перехватывать вызов функции (и возврат), агент может при необходимости переадресовать их механизму удаленного вызова процедур (Remote Procedure Call, RPC) так, что ни клиент, ни сервер этого не заметят. Единственное различие заключается в производительности — у внутрипроцессных вызовов она заметно выше.


Внутрипроцессные компоненты
Внутрипроцессные компоненты обычно реализуется в виде библиотек динамической загрузки (DLL). Они выполняются в том же адресном пространстве, что и клиент. Это самый эффективный метод связи между клиентом и компонентом — чтобы воспользоваться возможностями компонента, клиенту достаточно вызвать функцию.
Внепроцессные компоненты
Если объект находится вне процесса, вызов сначала переадресуется объекту-представителю (proxy), который предоставляется моделью СОМ или самим объектом (если его автор этого пожелает). Представитель упаковывает параметры вызова (включая любые указатели на интерфейс) и генерирует соответствующий RPC-вызов (или иной механизм в случае самостоятельно реализованных представителей), адресованный другому процессу или компьютеру, где реализован объект.
Связь с сервером
На сервере все вызовы функций интерфейса объекта выполняются через указатель на этот интерфейс. Указатель имеет смысл только в контексте конкретного процесса, поэтому роль вызывающего может играть только код того же процесса. Если объект внутрипроцессный, вызывающим будет сам клиент, в противном же случае — объект-«заглушка» (stub), предоставляемый СОМ или самим объектом. Заглушка принимает вызов RPC (или другого механизма в случае самостоятельно реализованного представителя) от представителя процесса-клиента, распаковывает параметры и вызывает соответствующий интерфейс серверного объекта. Независимо от конкретного механизма, клиент и сервер всегда считают, что взаимодействуют непосредственно с кодом внутри процесса.
Удаленный вызов процедур
Удаленный вызов процедур (Remote Procedure Call, RPC) основан на спецификации RPC распределенной среды программирования (Distributed Computing Environment, DCE-RPC) и по этой причине не зависит от платформы. СОМ-компоненты могут вызывать друг друга в гетерогенной среде, включающей платформы Windows 95, Windows NT, Unix и Macintosh и другие, поддерживающие DCE-RPC.
Резюме
СОМ позволяет клиентам связываться с объектами прозрачно, независимо от того, где они выполняются: в рамках того же процесса, в другом процессе или на ином компьютере.
Библиотека СОМ — основа прозрачного взаимодействия между процессами. Она инкапсулирует всю работу, связанную с запуском компонентов и установлением связи между ними, а также избавляет компоненты от контроля за их фактическим местонахождением.
Поддержка контроля версий и эволюции компонентов — фундамент СОМ. Благодаря ей, серверные объекты СОМ поддерживают интерфейсы для старых клиентов, одновременно предоставляя новым интерфейсы самой свежей версии.

Связывание и внедрение объектов


Занятие 3. Связывание и внедрение объектов

(Продолжительность занятия 20 минут)

Связывание и внедрение объектов (Object Linking and Embedding, OLE) — основанный на СОМ механизм, позволяющий приложениям взаимодействовать между собой. Он повышает эффективность работы за счет использования в приложении возможностей других программ. OLE применяют для построения составных документов, которые можно хранить в одном составном файле. На этом занятии Вы узнаете, как применять OLE для создания составных документов и управления приложениями.

Изучив материал этого занятия, Вы сможете:

создать составной документ;

использовать OLE-автоматизацию для управления приложением;

рассказать, что такое структурированное хранилище и как оно работает.

Составные файлы

Технология составных документов OLE основана на СОМ, структурированных хранилищах и унифицированной передаче данных. Объект «составной документ» — это, в сущности, объект СОМ, который можно внедрить в существующий документ или связать с ним. Как всякий объект СОМ, он предоставляет клиентам интерфейс IUnk-nown. Этот интерфейс делает доступными указатели на другие интерфейсы, реализующие конкретные возможности составного документа, а именно:

IQleObject;

IQleLink;

IViewObject2.

При создании составного документа одно приложение является контейнером, а другое — сервером. Серверный документ может быть связан с приложением-контейнером или внедрен в него. При связывании документа он хранится в отдельном от контейнера файле. Внедренные документы, напротив, хранятся в том'же файле, что и контейнер (рис. 5.8).

Применение составных файлов

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

 

Рис. 5.8 Использование составных документов

Разнообразие форматов и источников данных

Составные документы OLE позволяют работать внутри одного приложения со множеством данных в любых форматах из самых разнообразных источников.
Например, пользователь может вставить в документ текстового редактора график из одного приложения и звуковой объект — из другого. Активизировав график, Вы запустите создавшую его программу (или часть ее пользовательского интерфейса, содержащую средства редактирования объекта). Активизация звукового объекта позволит воспроизвести его средствами соответствующего приложения. В обоих случаях пользователь может манипулировать данными из внешних источников в контексте своего документа. > Использование составных документов В этом упражнении Вы сначала вставите в документ Microsoft Word растровое изображение, а затем отредактируете его средствами Microsoft Paint.
Запустите Microsoft Word и создайте новый документ.
В меню Insert щелкните команду Object.
В диалоговом окне Create New Object выберите пункт Bitmap Image и щелкните ОК. Обратите внимание, что теперь в Microsoft Word доступны меню и панель инструментов Microsoft Paint.
Нарисуйте изображение средствами Microsoft Paint.
Нажмите клавишу ESCAPE, чтобы вернуться в окно Word.
Добавьте в документ какой-нибудь текст.
Дважды щелкните вставленное изображение, чтобы отредактировать его с помощью Microsoft Paint.
Закройте Microsoft Word, не сохраняя документ.
Теперь Вы добавите график Microsoft Excel в форму Visual Basic как составной документ OLE. При этом автоматически включится поддержка его редактирования. > Создание проекта Visual Basic
Запустите Visual Basic и создайте новый стандартный проект.
Добавьте в форму новый элемент управления OLE.
Из списка Object Туре выберите Microsoft Excel Chart и щелкните ОК. В элементе управления появится простой график. Автоматически будет раз решено редактирование по месту.
Нажмите клавишу ESCAPE, чтобы вернуться в окно панели инструментов Visual Basic.
> Проверка средств редактирования
Запустите приложение.
Дважды щелкните график Microsoft Excel. Запустится процесс редактирования по месту. Обратите внимание на появление в форме меню Excel.
Если панель инструментов графика не отображается, в меню View, Toolbars выберите команду Chart.


В панели инструментов Chart щелкните кнопку Chart Type.
Щелкните 3-D Bar Chart и обратите внимание на изменение встроенного объекта-графика.
Дважды нажмите клавишу ESCAPE, чтобы закончить редактирование и вернуться в окно Visual Basic.
График будет обновлен в соответствии с новым типом.
Завершите приложение и закройте Visual Basic.
Структурированные хранилища OLE
При использовании объектов СОМ данные хранятся в специфическом формате, называемом структурированным хранилищем OLE. Он позволяет объединять данные из разных документов в один составной документ.
Система хранилищ напоминает файловую систему. Доступ к данным объекта осуществляется через ряд интерфейсов, предоставляемых OLE. Последний реализует систему хранилищ в виде составных файлов.
Файлы структурированных хранилищ
Основное назначение СОМ — интеграция приложений. Следствие объединения приложений — необходимость хранить содержащуюся в них информацию в одном и том же файле. Решение этой проблемы — файловая система внутри файла. Теперь не надо обрабатывать поток данных с помощью дескриптора и указателя смещения одного файла: OLE предоставляет модель, позволяющую трактовать файл как структурированный набор объектов двух типов — хранилищ и потоков (рис. 5.9). Они аналогичны каталогам и файлам соответственно. Эта модель называется структурированным хранилищем.


Рис. 5.9 Файлы структурированных хранилищ
Хранилища и потоки
Структурированное хранилище OLE — это иерархическая система хранения данных, которая имитирует файловую систему внутри файла. В ней два уровня хранения:
объекты-хранилища;
объекты-потоки.
Эти объекты аналогичны уровню каталогов типовой файловой системы (рис. 5.10). Первый содержит потоки и/или другие хранилища; второй — данные. Каждому объекту соответствует объект-хранилище. Доступ к объектам и данным в системе хранения осуществляется через набор интерфейсов, предоставляемых OLE.

Рис. 5.10 Хранилища и потоки
Эффективность структурированных хранилищ
Структурированные хранилища — простой и эффективный метод размещения объектов и составных файлов.


Этот механизм позволяет увеличить производительность и снизить накладные расходы, характерные для хранения отдельных объектов в обычных файлах. Вместо этого СОМ помещает все объекты в единый структурированный файл, состоящий из двух основных элементов: объектов-хранилищ и объектов-потоков. Вместе они действуют как файловая система внутри файла. Подобно файлу, поток содержит данные в виде последовательности байтов.
Вложенные объекты
Составной файл СОМ состоит из объекта «корневое хранилище», содержащего по крайней мере один объект-поток данных хранилища, и одного или нескольких объектов-хранилищ — связанных и внедренных объектов. Объект «корневое хранилище» назван по имени файла в той файловой системе, где он находится. Объекты-хранилища могут включать любое число объектов-потоков и вложенных объектов-хранилищ, реализующих объекты документа. Таким образом, документ содержит сколь угодно много вложенных объектов (рис. 5.11).
Например, если в документ Word вставлен график Excel, корневым объектом будет объект-хранилище документа Word. Он содержит как свои данные; так и OLE-данные для объекта Word. Кроме того, здесь же находится объект-хранилище для графика Excel с данными самого объекта и OLE-данными объекта Excel.

Рис. 5.11 Вложенные объекты
Модификация и добавление объектов
Добавление нового объекта к составному файлу или увеличение имеющегося объекта не вызывает перезаписи файла хранилища. Вместо этого новые данные записываются в первую свободную область хранилища, а объект-хранилище соответствующим образом обновляет свою таблицу указателей (в ней содержится информация о местонахождении объектов-хранилищ и потоков). Этот механизм повышает производительность операции с данными и позволяет конечным пользователям работать с составным хранилищем как с единым файлом, а не как с иерархией отдельных объектов.
Дополнительные преимущества
Избирательный доступ — позволяет загрузить и сохранить только нужный пользователю объект составного файла, а не файл целиком.
Совместное использование — несколько пользователей или приложений одновременно могут считывать и записывать информацию в один и тот же составной файл.


Обработка транзакций — пользователи вправе считывать и записывать информацию в составной СОМ-файл в режиме транзакций, когда все изменения в файле буферизуются и их можно разом сохранить или отменить.
Нетребовательность к памяти — структурированное хранилище позволяет сохранять файлы при нехватке памяти.
OLE-автоматизация
OLE-автоматизация — это сервис OLE, предназначенный для интеграции средств разработки и приложений: приложения предоставляют свои функции другим приложениям или управляют их возможностями на одном компьютере или в сетевой среде. Применение этой технологии обеспечивает автоматизацию приложений и их объединение с программным кодом. Вот основные элементы OLE-автоматизации.
Программы или их компоненты, которые могут управляться другими приложениями (серверы OLE-автоматизации). Microsoft Word, Excel, PowerPoint и Outlook — примеры серверов OLE-автоматизации. Они предоставляет другим приложениям доступ к своим функциям через объектные модели.
Другие приложения или средства разработки — контроллеры OLE-автоматизации, программно управляющие серверами OLE-автоматизации за счет доступа к функциям серверов. Microsoft Visual Basic, Visual C++, Visual FoxPro и Visual Basic for Application (который встроен в продукты Microsoft Office и может быть лицензирован для использования в других продуктах) — все это контроллеры OLE-автоматизации.
Фактически, OLE-автоматизация представляет собой процесс обмена инструкциями между контроллерами и серверами OLE-автоматизации. Пользуясь средствами, которые предоставил сервер, контроллер передает ему инструкции для выполнения.
Резюме
Технология OLE предназначена для создания составных документов и использования функциональных возможностей приложений. Технология составных документов OLE основана на СОМ, структурированных хранилищах и унифицированной передаче данных. Объект «составной документ» — это объект СОМ, который можно встроить в существующий документ или связать с ним. Составные документы позволяют манипулировать данными любых форматов из различных источников внутри одного приложения.
OLE определяет модель структурированного хранилища, которая трактует файл как структурированный набор объектов двух типов: хранилищ и потоков. Первые аналогичны каталогам, а вторые — файлам. Структурированное хранилище увеличивает производительность и уменьшает издержки, связанные с размещением объектов по отдельности в разных файлах.
Благодаря OLE-автоматизации приложения могут предоставлять свои функции другим приложениям или управлять их возможностями на одном компьютере или в сетевой среде.