Работа с СОМ-объектами

Организация интерфейса СОМ

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

 

Для обеспечения контракта надо задать:

· идентификацию каждого интерфейса;

· описание операций интерфейса;

· реализацию интерфейса.

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

Принято, чтобы символьные имена СОМ-интерфейсов начинались с буквы I (от Interface). Программное имя любого интерфейса образуется с помощью глобально уникального идентификатора (globallyuniqueidentifier — GUID). GUID интерфейса считается идентификатором интерфейса (interfaceidentifier — IID). GUID — это 16-байтовая величина (128-битовое число), генерируемая автоматически.

Уникальность во времени достигается за счет включения в каждый GUID метки времени, указателя момента создания. Уникальность в пространстве обеспечивается цифровыми параметрами компьютера, который использовался для генерации GUID.

Описание интерфейса

Для определения интерфейсов применяют специальный язык — язык описания интерфейсов (InterfaceDefinitionLanguage — IDL). Описание интерфейса начинается со слова object, отмечающего, что будут использоваться расширения, добавленные СОМ к оригинальному IDL. Далее записывается программное имя (IID интерфейса), оно начинается с ключевого слова uuid (UniversalUniqueIdentifier — универсально уникальный идентификатор). UUID является синонимом термина GUID.

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

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

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

Внешний указатель на интерфейс (указатель клиента) ссылается на внутренний указатель объекта СОМ. Внутренний указатель — это адрес виртуальной таблицы. Виртуальная таблица содержит указатели на все операции интерфейса.

Первые три элемента виртуальной таблицы являются указателями на операции, унаследованные от интерфейса IUnknown. Такая ситуация типична для любого СОМ-интерфейса.

Обработка клиентского вызова выполняется в следующем порядке:

· с помощью указателя на виртуальную таблицу извлекается указатель на требуемую операцию интерфейса;

· указатель на операцию обеспечивает доступ к ее реализации;

· исполнение кода операции обеспечивает требуемую услугу.

Интерфейс lUnknown обеспечивает минимальное «снаряжение» каждого объекта СОМ. Он содержит три операции и предоставляет любому объекту СОМ две функциональные возможности:

· операция Querylnterface() позволяет клиенту получить указатель на любой интерфейс объекта (из другого указателя интерфейса);

· операции AddRef() и Release() обеспечивают механизм управления временем жизни объекта.

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

Имеет смысл отметить и второе важное достоинство операции Querylnterface. В сочетании с требованием неизменности СОМ-интерфейсов она позволяет «убить двух зайцев»:

· развивать компоненты;

· обеспечивать стабильность клиентов, использующих компоненты.

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

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

Правила финализации СОМ-объекта очень просты:

· при выдаче клиенту указателя на интерфейс выполняется СЧС+1;

· при вызове операции AddRef выполняется СЧС+1;

· при вызове операции Release выполняется СЧС-1;

· при СЧС=0 объект уничтожает себя.

Конечно, клиент должен помогать достойному харакири объекта-самурая:

· при получении от другого клиента указателя на интерфейс СОМ-объекта он должен вызвать в этом объекте операцию AddRef;

· в конце работы с объектом он обязан вызвать его операцию Release.

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

· Сервер «в процессе» (in-process) — объекты находятся в динамически подключаемой библиотеке и, следовательно, выполняются в том же процессе, что и клиент;

· Локальный сервер (out-process) — объекты находятся в отдельном процессе, выполняющемся на том же компьютере, что и клиент;

· Удаленный сервер — объекты находятся в DLL или в отдельном процессе, которые расположены на удаленном от клиента компьютере.

Преимущества COM

В качестве кратких выводов отметим основные преимущества СОМ.

1. СОМ обеспечивает удобный способ фиксации услуг, предоставляемых разными фрагментами ПО.

2. Общий подход к созданию всех типов программных услуг в СОМ упрощает проблемы разработки.

3. СОМ безразличен язык программирования, на котором пишутся СОМ-объекты и клиенты.

4. СОМ обеспечивает эффективное управление изменением программ — замену текущей версии компонента на новую версию с дополнительными возможностями.

Работа с СОМ-объектами

Клиент может содержать прямую ссылку на СОМ-объект только в одном случае — когда СОМ-объект размещен в сервере «в процессе». В случае локального или удаленного сервера он ссылается на посредника.

Посредник — СОМ-объект, размещенный в клиентском процессе и предоставляющий клиенту те же интерфейсы, что и запрашиваемый объект. Запрос клиентом операции через такую ссылку приводит к исполнению кода посредника.

Посредник принимает параметры, переданные клиентом, и упаковывает их для дальнейшей пересылки. Эта процедура называется маршалингом. Затем посредник (с помощью средства коммуникации) посылает запрос в процесс, который на самом деле реализует СОМ-объект.

По прибытии в процесс локального сервера запрос передается заглушке. Заглушка распаковывает параметры запроса и вызывает операцию СОМ-объекта. Эта процедура называется демаршалингом. После завершения СОМ-операции результаты возвращаются в обратном направлении.

Код посредника и заглушки автоматически генерируется компилятором MIDL (Microsoft IDL) по IDL-описанию интерфейса.

Помимо информации об интерфейсах, IDL-описание может содержать информацию о библиотеке типа. Библиотека типа определяет важные для клиента характеристики СОМ-объекта: имя его класса, поддерживаемые интерфейсы, имена и адреса элементов интерфейса.

Описание библиотеки типа начинается с ее уникального имени (записывается после служебного слова uuid), затем указывается номер версии библиотеки. После служебного слова library записывается символьное имя библиотеки. Далее в операторе importlib указывается файл со стандартными определениями IDL - stdole32.tlb. Тело описания библиотеки включает только один элемент — СОМ-класс (coclass), на основе которого создается СОМ-объект.

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

 

 

ActiveX — это средство Microsoft для добавления компонентов в приложения. Компания Microsoft разработала такое количество управляющих элементов ActiveX, что среди них можно найти практически все, что необходимо для приложений. В последнее время широкое распространение получают ActiveX-компоненты, которые представляют собой полнофункциональные элементы управления. Компоненты ActiveX представляют собой 32-разрядные объекты, содержащие код и данные. Одним из свойств элемента ActiveX является его уникальный 32-разрядный шестнадцатеричный идентификационный номер CLASS ID (аббревиатура CLSID).

В отличие от библиотек классов VisualFoxPro, ActiveX-компоненты могут создаваться с помощью различных средств разработки, напримерVisual C++ или VisualBasic. Вы можете использовать ActiveX-компоненты аналогично базовым компонентам VisualFoxPro. Основным преимуществом данных компонентов является их огромное количество, так как их разработкой занимаются многие фирмы, а также отдельные программисты. Часть этих компонентов является коммерческой продукцией, часть

распространяется бесплатно. Множество компонентов включено в поставку VisualStudio и в приложение MicrosoftOffice. Для поиска необходимых компонентов вы можете использовать Интернет.

Предназначена для написания сетевых приложений. Она предоставляет программистам наборы стандартных библиотек, значительно облегчающих процесс кодирования. Если раньше при написании программ использовались механизмы OLE (OLE Automation, OLE Documents, OLE Controls,...), основанные на компонентной объектной модели (COM - ComponentObjectModel), то теперь библиотеки OLE переписаны так, чтобы обеспечивать функциональность, достаточную для написания сетевых приложений. Таким образом, теперь при написании программ используется DCOM (DistributedComponentObjectModel) - распределенная компонентная объектная модель, а реализуют ее библиотеки ActiveX, которые по объему оказались гораздо меньше, чем библиотеки OLE, а по скорости - быстрее. Сохранилась и совместимость - любой программный компонент OLE будет работать с библиотеками ActiveX.

Поскольку самым динамично развивающимся направлением в компьютерной индустрии является Internet, именно здесь наиболее естественно могут найти свое место программы, написанные с использованием технологии ActiveX. Не случайно в последнее время понятия ActiveX и Internet часто встречаются рядом. В то же время технология ActiveX имеет значительно более универсальную область использования.

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

ActiveX включает в себя клиентскую и серверную части, а также библиотеки для разработчика:

· программные элементы ActiveX - компоненты, работающие на компьютере-клиенте, но загружаемые в первый раз с сервреаWeb. С их помощью можно демонстрировать разнородную информацию, включающую видео и звук без запуска дополнительных программ. Более того, эти программные компоненты могут использоваться в приложениях, написанных на любых популярных языках программирования, включая Java (Visual J++), VisualBasic, Visual C++.

· ActiveScripting поддерживает любой популярный макроязык, включая VisualBasicScript и JScript (реализация компанией Microsoft языка сценариев JavaScript). Макроязыки могут использоваться для объединения на одной странице нескольких программных элементов ActiveX или Java, обеспечивая их взаимодействие между собой.

· Документы ActiveX позволяют открыть и обрабатывать в окне MicrosoftInternetExplorer документ любого формата (например, файл MicrosoftExcel или Word).

· Виртуальная машина Java позволяет любой программе просмотра Internet, поддерживающей технологию ActiveX (например, InternetExplorer 3.0) выполнять программные компоненты Java и обеспечивать их взаимодействие с программными компонентами ActiveX.

· ActiveXServerFramework обеспечивает серверные функции ActiveX, включая поддержку безопасных соединений, доступ к базам данных и другие.

· Средства разработки позволят использовать знакомые системы программирования Microsoft и других фирм для создания компонентов ActivX. К их числу относятся VisualBasic, Visual C++, MacromediaShockwave, AdobePhotoshop, BorlandDelphi, средства программирования Sybase и другие.

Основные преимущества использования технологии ActiveX:

· Быстрое написание программного кода. Программирование сетевых взаимодействий становится очень похожим на программирование для отдельного компьютера.

· Открытость и мобильность. Спецификации технологии недавно были переданы в OpenGroup как основа открытого стандарта. Кроме того, Microsoft совместно с компаниями Metrowerks и Bristol заканчивает реализацию технологий ActiveX для платформ Macintosh и UNIX.

· Возможность написания приложений с использованием знакомых средств разработки. Программные элементы ActiveX могут быть созданы с помощью VisualBasic, Visual C++, BorlandDelphi, Borland C++, любых средств разработки на Java.

· Большое количество уже существующих программных элементов ActiveX, которые бесплатно могут применяться на серверах Web и в приложениях независимых разработчиков. Кроме того почти любой программный компонент OLE совместим с технологиями ActiveX и может применяться без модификаций в сетевых приложениях.

· Стандартность. Технология ActiveX основана на широко используемых стандартах Internet (TCP/IP, HTML, Java) с одной стороны и стандартах, введенных в свое время Microsoft и необходимых для сохранения совместимости (COM, OLE).

 


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



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