Что такое 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 работает как некий функциональный блок для приложения, разработчик должен соблюсти следующие требования:
Кроме того, для управляющего элемента часто используются технологии, включенные в OLE.
Интересен и процесс использования элементов ActiveX. Элементы ActiveX располагаются на страницах Web во время разработки последних. Во многих инструментах для создания узлов Web имеются соответствующие возможности. Для размещения ActiveX могут быть применены и специальные программы, самая популярная из которых - Microsoft ActiveX Control Pad.
Когда страница Web загружается на компьютер пользователя, для каждого элемента ActiveX, содержащегося на странице, создается экземпляр объекта. Этому служит специальная ссылка - моникер (moniker), известная программистам, разрабатывающим приложения с применением OLE. Моникер помогает абстрагироваться от реального имени и местоположения объекта. Имея моникер объекта, можно получить ссылку на этот объект и загрузить его на клиентский компьютер, не вдаваясь в детали местоположения объекта. Такой процесс загрузки называется связыванием (binding). В OLE моникеры используются особенно часто, если требуется сохранить состояние объекта, а затем некоторое время спустя восстановить его. Именно благодаря моникерам можно перемещать сложные документы с одного места файловой системы на другое, не боясь повредить ссылки на встроенные и связанные с главным документом объекты.
При загрузке ActiveX из Web также используются моникеры, например, асинхронный моникер позволяет вести загрузку ActiveX и его данных в фоновом режиме, не прерывая работу пользователя со страницей.
Заметим, что процесс загрузки ActiveX достаточно сложен, хотя и хорошо спрятан от глаз пользователя. Когда приложение-контейнер обнаруживает размещенный на 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 могут быть лицензированы для предотвращения их нелегального использования.