Что такое 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 могут быть лицензированы для предотвращения их нелегального использования.

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