Что такое ActiveX, не может толком сказать никто. Обычно на этот вопрос отвечают: "Переименованная технология OLE". Но если быть точными, OLE - лишь часть того, что называют компонентной объектной моделью COM (Component Object Model). Ясности, однако, от этого не прибавляется. Попробуем расставить точки над i и назовем ActiveX расширенной технологией OLE, базирующейся на модели COM и призванной "активизировать" компьютер, т. е. существенно увеличить его функциональные возможности (в первую очередь за счет интеграции в Internet и intranet).

Основными компонентами технологии ActiveX являются управляющие элементы ActiveX (с различными дополнениями), ActiveX Conferencing - средство, превращающее компьютер в коммуникационное устройство сети Internet, ActiveX Scripting - средство создания собственных программ обработки языков сценариев (скриптов), как, например, VBScript и JScript, встроенных в Microsoft Internet Explorer. И хотя это не все, но для первого представления о технологии ActiveX, согласитесь, уже достаточно.

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

Фундамент ActiveX

Компонентная объектная модель (COM) - это спецификация, описывающая, как создаются объекты, как они взаимодействуют, чтобы выполнить ту или иную функцию в системе. В соответствии с COM каждый объект имеет в своем составе интерфейсы. Интерфейс - это набор методов, т. е. функций, объединенных между собой для достижения какой-либо цели. К примеру, интерфейс IClassFactory служит для создания новых объектов COM и управления ими. Для этого в составе интерфейса IClassFactory имеются два метода: CreateInstance, создающий новый объект заданного класса, и LockServer, предотвращающий выгрузку программы-генератора объектов (сервера) из памяти. Обычно любой COM-объект содержит более одного интерфейса. Если взять, скажем, все тот же сервер для создания объектов, то в нем, кроме интерфейса IClassFactory, содержатся еще несколько интерфейсов, из которых самый важный - IUnknown. Как гласит спецификация компонентной объектной модели, любой объект должен содержать в себе интерфейс IUnknown. Его назначение - поиск других интерфейсов, включенных в объект (метод QueryInterface), и отслеживание счетчика блокировок (методы AddRef и Release). При создании нового объекта ему передается интерфейс IUnknown. Попутно вызывается метод AddRef, увеличивающий счетчик блокировок на единицу. Теперь, чтобы получить какой-нибудь другой интерфейс объекта, можно вызвать QueryInterface, который либо вернет вам требуемый интерфейс, либо код ошибки, говорящей о том, что такого интерфейса в составе объекта нет. Именно поэтому интерфейс IUnknown должен быть в каждом объекте: без него вы просто не сможете получить других требуемых для работы интерфейсов.

Внимательные читатели, владеющие каким-либо объектно-ориентированным языком программирования, обратят внимание на тот факт, что интерфейсы очень похожи на классы. И это правда, за исключением того, что в Си++ интерфейс описывается как структура с соответствующими методами. А вообще-то объекты COM можно создавать на различных языках программирования, главное, чтобы они соответствовали требованиям, описанным в спецификации COM. Хороший пример - пакет Borland Delphi. Несмотря на то что в его основе лежит язык Object Pascal, с его помощью легко создавать COM-объекты.

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

Знакомство с ActiveX

Элементы ActiveX были разработаны на базе управляющих элементов OLE, иначе называемых OCX. Самые первые OCX были сложны в изготовлении из-за необходимости реализовать большое количество различных интерфейсов, нужных и ненужных вообще. Так, например, если вы изготавливаете управляющий элемент, который будет работать где-то в памяти, выполняя различные вычисления, то нет никакой необходимости реализовывать код, отвечающий за вывод информации на экран. И если ранее такой мертворожденный код требовался по определению, то сейчас можно создать управляющий элемент ActiveX, оставив в нем лишь то (или почти то), что действительно требуется для выполнения полезных функций.

Поскольку каждый элемент ActiveX работает как некий функциональный блок для приложения, разработчик должен соблюсти следующие требования:

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

    Интересен и процесс использования элементов ActiveX. Элементы ActiveX располагаются на страницах Web во время разработки последних. Во многих инструментах для создания узлов Web имеются соответствующие возможности. Для размещения ActiveX могут быть применены и специальные программы, самая популярная из которых - Microsoft ActiveX Control Pad.

    Когда страница Web загружается на компьютер пользователя, для каждого элемента ActiveX, содержащегося на странице, создается экземпляр объекта. Этому служит специальная ссылка - моникер (moniker), известная программистам, разрабатывающим приложения с применением OLE. Моникер помогает абстрагироваться от реального имени и местоположения объекта. Имея моникер объекта, можно получить ссылку на этот объект и загрузить его на клиентский компьютер, не вдаваясь в детали местоположения объекта. Такой процесс загрузки называется связыванием (binding). В OLE моникеры используются особенно часто, если требуется сохранить состояние объекта, а затем некоторое время спустя восстановить его. Именно благодаря моникерам можно перемещать сложные документы с одного места файловой системы на другое, не боясь повредить ссылки на встроенные и связанные с главным документом объекты.

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

    Заметим, что процесс загрузки ActiveX достаточно сложен, хотя и хорошо спрятан от глаз пользователя. Когда приложение-контейнер обнаруживает размещенный на Web-странице текстовый маркер , характерный для описания ActiveX, оно пытается создать экземпляр ActiveX, для чего считывает его атрибут CLSID (идентификатор, уникальный для каждого COM-объекта в системе), затем передает его менеджеру OLE на клиентском компьютере. Менеджер пытается определить, зарегистрирован ли в системе объект с таким атрибутом, и если да, то создает этот объект. Если же объект данного класса неизвестен системе, программа-контейнер смотрит атрибут CodeBase, который обычно имеется внутри текстового маркера . Этот параметр указывает URL (универсальный адрес, принятый в Web), откуда можно получить объект данного класса. По этому URL создается ссылка-моникер, используя которую контейнер копирует ActiveX с Web-сервера. Если ActiveX зашифрован, то вызывается специальный код, который расшифровывает ActiveX с использованием общедоступного ключа и сравнивает полученную лицензионную информацию с доступной. Если все сходится, то программа-контейнер считает, что ActiveX лицензионный и, следовательно, может быть безопасно запущен на компьютере-клиенте. В дальнейшем мы увидим, как изготавливаются лицензионные управляющие элементы ActiveX.

    Примерно так же происходит и чтение необходимых данных. Малое количество данных может быть передано как параметр текстового маркера через страницу Web. Но иногда требуется получить данные непосредственно с сервера Web. Тогда программа-контейнер ищет параметр DATA этого маркера, который представляет собой адрес URL, создает по нему моникер и с его помощью производит копирование данных с Web-сервера, как это происходило ранее с самим объектом.

    Безопасность данных

    Безопасность использования получаемых через Internet кода и данных - достаточно серьезная проблема, над решением которой трудятся многие производители программного обеспечения. С того самого момента, как были разработаны управляющие элементы ActiveX, аналитики предсказывали им скорую гибель, мотивируя это тем, что сама технология ActiveX не может обеспечить достаточной защиты от вторжения в систему злоумышленников, и даже тем, что, имея неограниченный доступ к системным ресурсам, ActiveX может быть переносчиком вредного кода. Тем не менее элементы ActiveX не только выжили, но и постоянно завоевывают все новые и новые рынки, благодаря тому что разработчикам из Microsoft и других фирм удалось справиться с проблемой защиты. Технология защиты получила название Authenticode. Основанная на открытом стандарте и методике шифрования с помощью открытого ключа, Authenticode дает возможность использовать цифровую подпись компании-разработчика на потенциально опасных файлах, загружаемых из Internet. Технология Authenticode позволяет защитить файлы:

      исполняемые - exe;
      архивы, изготовленные с помощью Diamond SDK, - cab;
      управляющие элементы OLE - ocx;
      аплеты Java - class.

    Процесс создания защищенного ActiveX достаточно сложен и состоит из следующих этапов:

      генерация открытого и закрытого ключей шифрования;
      изготовление электронного сертификата подлинности ActiveX;
      подписывание защищаемого ActiveX с помощью закрытого ключа шифрования и сертификата.

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

    Как видите, защита передаваемых элементов ActiveX настолько изощренная, что вряд ли кому придет в голову пытаться ее обмануть. Гарантий безопасности при использовании технологии Authenticode более чем достаточно.

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


    Составляющие ActiveX

    Свойства и методы

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

    События

    В дополнение к свойствам и методам элементы ActiveX могут предоставлять интерфейсы, через которые можно подавать сигналы-события всем заинтересованным в них программам. Соответственно программы, заинтересованные в получении событий, должны позаботиться об их перехвате, для чего в них должны быть предусмотрены фрагменты кода, называемые обработчиками событий.

    Визуальное представление

    Очень многие управляющие элементы могут размещать и отображать себя внутри окна программы-контейнера, которая использует эти элементы. Контейнер управляет расположением и размером ActiveX, которые он содержит.

    Обработка событий клавиатуры

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

    Сохранение состояния

    Управляющий элемент ActiveX может сохранять и восстанавливать свое состояние. Это позволяет не тратить время на повторную настройку элементов.

    Регистрация и лицензирование

    Перед использованием элементы ActiveX должны быть зарегистрированы в системе и отмечены в реестре (регистраторе). Обычно элементы сами проделывают эту работу. Кроме того, элементы ActiveX могут быть лицензированы для предотвращения их нелегального использования.