Лекция. ОСНОВЫ ТЕХНОЛОГИИ ActiveX
CGI — это действительно мощная технология, но... в рамках возможностей языка HTML. Ничего другого, кроме нехитрых возможностей форматирования, пусть даже и усовершенствованных каскадными страницами стилей, этот язык не предоставляет. В отличие от Web-страниц, подготовленных с помощью языка HTML, настольные приложения позволяют использовать всю функциональную мощь компьютера. Разработка и внедрение технологий, переводящих обычные Web-страницы в контейнеры для программ, — это та область, над которой работает компания Microsoft с 1996 года. В принципе, созданная концепция имеет намного более широкие возможности, нежели просто интеграция Web-технологий и классических Windows-программ, но мы будем описывать только те ее особенности, которые пересекаются с интересами создателя Web-систем. Итак, комплекс решений и стандартов, которые описывают внедрение объектов в Web-страницы, называется ActiveX.
Посредством использования этого комплекса, можно создавать компоненты, которые скачиваются из Интернета и работают на клиентской машине, оперируя как пользовательскими данными, так и значениями, переданными в качестве параметров в теле Web-страницы.
Что такое ActiveX-элементы управления?
Значительная доля программ использует широкие наборы визуальных компонентов, как имеющихся в инструментарии Delphi, так и созданных непосредственно программистами. Эти компоненты представляют собой программный интерфейс (описание полей, методов, событий и свойств) и реализационную часть. Подключая некие компоненты к среде Delphi, a именно, помещая их в Component Palette, разработчик делает их доступными к использованию во всех создаваемых приложениях. Однако эти компоненты могут использоваться только в данном экземпляре Delphi. Для их внедрения в программы, создаваемые в другой копии Delphi, компоненты нужно подключать вновь. Нельзя, например, перенести визуальный компонент в скомпилированном виде на другой компьютер и, затем, непосредственно из программы, обратиться к нему.
Разумеется, перед визуальными компонентами Delphi не стоит задача быть готовыми к использованию из любой программы в "чистом виде". Они главным образом предназначены для инкапсуляции свойств и методов объектов и визуальной работы с ними в режиме проектирования. Эти замечания были даны, чтобы показать, что существует сама1проблема переносимости программных компонентов и их использования в различных программах.
Многие идеи переносимости и использования модулей, написанных на одном языке программирования, в приложениях, созданных на другом, а также компонентной структуре программы нашли свое отражение в динамически подключаемых библиотеках (Dynamically Linked Library, DLL).
Действительно, динамически подключаемая библиотека — это отдельный файл, в котором в скомпилированном виде хранится некий программный код. Этот код может создаваться с использованием объектно-ориентированного подхода. Более того, как и любое полнофункциональное приложение, библиотечный код имеет доступ к API (Application Program Interface, интерфейс прикладного программирования), что позволяет DLL работать даже с визуальными возможностями Windows.
Однако, в отличие от обычного ЕХЕ-файла, динамически подключаемая библиотека не может работать "сама по себе". Она представляет собой набор функций, готовых к вызову из любого приложения! Именно набор функций, и не больше того. Естественно, эти функции могут выполнять сложные по структуре операции, могут даже создавать свои окна, но это будут их окна! Это уже не окна приложения, которое обратилось к функции, содержащейся в DLL. He так-то просто заставить функции из динамически подключаемой библиотеки рисовать кнопки на форме главного приложения.
Таким образом, мы видим, что динамически подключаемые библиотеки, несмотря на видимую компонентную природу, обладают следующим недостатком: нет возможности обратиться к их объектам, минуя функции вызова. Следовательно, нет возможности зарегистрировать и использовать в приложении объект, вызванный из DLL. Отсюда можно сделать вывод, что классическая динамически подключаемая библиотека представляет собой достаточно разрозненную по отношению к вызывающему приложению структуру.
Для того чтобы реализовать возможность применения объектов, созданных одними разработчиками, с использованием некоторых средств разработки приложений в программах, которые написаны, возможно, совершенно другими людьми, даже не имеющими понятия, как работают указанные объекты, и более того, не ведающими об их внутренней реализации, и была создана ActiveX.
Эта спецификация устанавливает правила создания элементов управления (в некотором роде — тех же компонентов), обеспечивающих готовность к внедрению в любую программу на любом этапе как проектирования, так и выполнения.
Цифровая подпись кода
Поскольку ActiveX-элементы управления имеют полный доступ к ресурсам компьютера и могут не только занести опасный вирус, но и напрямую удалить файлы с жесткого диска, то процедура регистрации и запуска компонентов на компьютере привлекает повышенное внимание с точки зрения безопасности.
Нельзя придумать универсального алгоритма проверки "вредоносности" загружаемого из сети Интернет кода, подобно тому, как это сделано в антивирусах. Не следует и просто ограничивать возможности ActiveX-компонентов, поскольку это снизит их функциональность и поставит перед конечными пользователями и разработчиками вопрос — а зачем тогда они (компоненты) нужны?
Поэтому принята технология проверки не самого компонента, а его принадлежности конкретному разработчику при помощи цифровой подписи. Authenticode — так называется эта система. Юридическое или физическое лицо, которое желает разрабатывать и подписывать своей подписью ActiveX-компоненты должно пройти регистрацию в одной из сторонних фирм, занимающихся выдачей электронных подписей, например VeriSign (адрес сайта www. ). После регистрации разработчику выдаются файлы цифровых подписей, и при помощи специальной утилиты в созданные компоненты добавляется информация о наличии подписи и ее сроке действия. Теперь клиент, загрузивший на свой компьютер ActiveX-компонент, получит уведомление о том, что загруженный код действительно создан указанным автором, и в зависимости от того, доверяет ли он указанному лицу, клиент либо позволит запускать данный компонент на своем компьютере, либо нет. Это исключает вероятность подмены авторства у подписанных компонентов и позволяет предоставлять клиенту возможность удостоверяться в том, что загружаемая программа принадлежит указываемому автору.
Работа с ActiveX в Delphi
Вообще говоря, создание элементов управления ActiveX представляет собой достаточно содержательную задачу. Причем не только, и порою даже не столько с точки зрения реализации алгоритма работы объекта, а именно создания интерфейса к нему. Существуют книги, содержащие сотни страниц с описанием процесса создания интерфейса к вашим объектам и последующего превращения их в элементы управления ActiveX. Однако эти книги посвящены языку C++. В Delphi все особенности создания элементов управления ActiveX скрыты от программиста. Поэтому все, что ему остается сделать, — это определить некоторые параметры генерации компонентов.
Элементы управления ActiveX получаются путем генерации их из визуальных компонентов Delphi. Причем как стандартных элементов среды, так и созданных самостоятельно программистами. Разработчики, которые создавали вручную элементы управления с помощью других средств, по-настоящему оценят "волшебную палочку" мастера Delphi.
К поистине замечательным возможностям Delphi следует отнести ActiveXForm Wizard (мастер создания ActiveX-форм). Эта утилита позволяет создавать приложение, которое в дальнейшем будет внедрено в Web-страницу, в режиме, практически не отличающимся от написания настольной программы.
Кроме того, эта среда разработки приложений позволяет использовать ActiveX-элементы управления, зарегистрированные в системе. Это могут быть компоненты, созданные другими разработчиками и, возможно, на других языках программирования. Среда Delphi может автоматически преобразовывать их в визуальные компоненты и помещать в Component Palette, чтобы затем их можно было использовать в создаваемых программах аналогично другим компонентам.
Поскольку наша задача заключается в описании создания Web-ориентированных приложений, то центральным моментом нашего изложения будут не элементы управления ActiveX, а приложения, которые можно внедрять в Web-страницы.
Создание ActiveX-форм
По сути, Delphi предоставляет возможность для построения приложений, внедряемых в Web-страницы. Для того чтобы создать ActiveX-приложение, нужно выбрать следующую последовательность меню: File | New | ActiveX | ActiveX Form.
В появившемся диалоговом окне (рис. 12.1) в поле New ActiveX Name следует вписать имя создаваемого приложения. Названия файла проекта и пока единственного модуля формы изменяются автоматически в соответствии с вводимым именем проекта, но могут быть произвольными. Позже, при сохранении файлов проекта на диске, их имена и расположение можно будет менять.
Выпадающее меню с названием Threading Model содержит пункты, устанавливающие режим работы с потоками создаваемого элемента управления. Дело в том, что спецификация ActiveX разрешает одновременное использование серверов автоматизации в нескольких режимах:
Single — создает очередь при попытке параллельного использования одного элемента управления.
<>
Рис. 12.1. Диалоговое окно выбора параметров создаваемого ActiveX-приложения
Apartment — динамически рождает новый экземпляр сервера в памяти, и работа с каждым из них ведется независимо.
Free — реализует многопоточный режим работы с компонентом. При этом единственный экземпляр последнего обеспечивает реализацию всех запросов. Данный тип характеризуется достаточно сложной реализацией в связи с необходимостью контроля за целостностью данных, но экономит ресурсы компьютера.
Both — обеспечивает работу клиентов, рассчитанных на взаимодействие по любому из двух предыдущих принципов.
Опция Make Control Licensed позволяет включить режим зашиты элемента управления ActiveX от нелегального использования путем добавления в дистрибутив элемента специального лицензионного файла. Опция Include Version Information определяет возможность идентификации версии создаваемого элемента управления. При включении этой опции компилятор каждую новую версию ActiveX-формы помечает новым номером, что особенно удобно при отладке, поскольку обращение к новой версии элемента управления исключает использование старой.
Опция Include About Box предоставляет возможность создания вместе с основной формой Web-приложения маленькую форму с указанием короткой сопроводительной информации.
После того как установлены необходимые опции и введено название проекта, можно нажимать кнопку ОК.
При создании элементов управления открывается рабочая среда, несколько отличная от той, которая активизируется при написании обычного приложения.
Прежде всего, вместо обычного проекта создается библиотека, как при написании DLL-модуля. Кроме того, создаваемая форма уже принадлежит не к классу TForm, а к классу TActiveFormx. В программном модуле уже описаны процедуры и функции, обеспечивающие установку и извлечение свойств формы.
Добавление внешних свойств в ActiveX-форму
При разработке элементов управления реализуются достаточно сложные механизмы создания абстрактных интерфейсов и наследования. Разработчики среды Delphi избавили программистов от необходимости самостоятельно проектировать интерфейсы к создаваемым СОМ-серверам. Если вы хотите что-либо откорректировать в вами же предложенном варианте, то это можно сделать вручную, на базе уже сгенерированного кода.
Доступ к переменным, которые используются в программе, может быть осуществлен только в том случае, если они объявлены свойствами класса, представляющего ActiveX-форму, а именно — ActiveFormX.
Для добавления переменной нужно выполнить следующую последовательность шагов, вызывая соответствующие пункты меню: Edit | Add to Interface. При этом на экране появится окно, приведенное на рис. 12.2.
Рис. 12.2. Меню добавления свойств, методов, событий
Это меню позволяет добавить описание нового свойства (равносильно, как и метода или события) сначала в класс, являющийся интерфейсом класса формы (его наличие вызвано особенностью реализации СОМ-объектов), а затем в сам класс формы. При этом создается шаблон процедуры, которая позволяет выполнить какие-либо действия при установке этого свойства и функции, которая должна возвращать значение данного свойства. Эти два метода выполняют задачи, аналогичные возникающим при описании свойств классов языка Object Pascal. Для добавления свойства его нужно описать аналогично предварительной декларации при описании классов. Например, property Myinfo: byte. При нажатии кнопки ОК интерфейс и реализация создаваемого объекта обновятся, в соответствии с внесенными изменениями.
Обратите внимание, что типы данных, используемые при описании свойств, не полностью совпадают с типами Object Pascal, и их перечень ограничен для совместимости с другими средствами разработки и типами, используемыми в Windows.
В табл. 12.1 приведем наиболее используемые типы данных.
Таблица 12.1. Некоторые типы данных, используемые при обмене информацией между сервером автоматизации и клиентом
Тип данных | Описание |
Byte | Аналогичен типу Byte из Object Pascal |
Currency | Аналогичен типу Currency Object Pascal |
Double | Аналогичен типу Double Object Pascal |
WideString | Аналогичен типу WideString WideString из Object Pascal |
При работе с внешними переменными нельзя использовать тип string. Вместо него, как видно из таблицы, можно применить нуль-терминованные строки WideString.
Внедрение элементов управления в Web-страницу
Для того чтобы созданный объект был доступен клиенту, необходимо его разместить на сервере, а в Web-странице создать соответствующее обращение к нему.
Как происходит загрузка компонентов ActiveX
Когда пользователь загружает Web-страницу, на которой есть ссылка на элемент управления ActiveX, браузер проверяет настройки безопасности компьютера, и, если они позволяют, посылает на сервер запрос на передачу двоичного кода скомпилированного компонента. Сервер, получив запрос, проверяет, доступен ли запрашиваемый файл, и если он доступен, то передает его клиенту. После получения кода компонента он должен быть зарегистрирован в системе (реестре). Об этом, опять-таки исходя из настроек безопасности, выдается предупреждение клиенту, с указанием информации о наличии цифровой подписи, и при существовании последней, информация о производителе загруженного элемента управления. Если пользователь разрешит, то элемент управления регистрируется и запускается на выполнение. При этом, как правило, его окно отображается в заранее определенной области Web-страницы. Кроме того, браузер передает ему параметры, которые могли быть указаны на Web-странице, в которую внедрен элемент управления ActiveX. Благодаря наличию такой возможности, серверу достаточно динамически формировать HTML-код, с указанием значений используемых параметров, чтобы заставить динамически работать элемент управления ActiveX. Процесс внедрения ActiveX-компонента осуществляется с использованием элемента OBJECT языка HTML, которому соответствует тег <OBJECT>, атрибуты которого описаны в следующем разделе.
Тег <OBJECT>языка HTML
Для того чтобы внедрить в документ HTML различные ActiveX-объекты или Java-апплеты, используется тег <OBJECT>.
Он имеет следующие основные атрибуты:
classid — содержит уникальный 128-битный идентификатор, под которым элемент управления регистрируется в системе.
codebase — указывает URL, где расположен компонент.
standby — может применяться для задания текста, который будет отображаться во время загрузки компонента.
Height — содержит высоту области, отводимой под элемент управления.
width — содержит ширину области, отводимой под элемент управления.
Name — применяется в контексте форм, если элемент управления служит для приема клиентских сведений с целью их последующей отправки на сервер.
К этим атрибутам, характеризующим базовые сведения об объекте, добавляются параметры, которые автоматически передаются браузером объекту для использования.
Для этого применяется элемент PARAM, имеющий основные атрибуты:
Name — содержит название переменной, значение которой должно быть установлено.
Value — устанавливаемое значение переменной.
В отличие от элемента OBJECT, где наличие конечного тега обязательно, использование последнего в элементе PARAM запрещено. Пример внедрения элемента управления ActiveX в Web-страницу приведен в листинге 12.1.
Листинг 12.1. Пример внедрения ActiveX-элемента управления в Web-страницу
<HTML>
<Н1> Пример внедрения ActiveX-формы в Web-страницу</Н1>
<p><OBJECT
classid="clsid:C9F21C24-DA34-4D93-93CD-75F5BOD2AD68" codebase="http://localhost/ax/axProjl. cab#version=l,0,2,0"
width=429
height=275
align=center
hspace=0
vspace=0>
<PARAM NAME="MyParametr" VALUE="DynamValue">
</OBJECT>
</HTML>
Устанавливая значения параметров динамически, с помощью CGI-техно-логий, можно добиться интерактивной работы таких форм не только в контексте настольного приложения, но и в режиме клиент-серверного взаимодействия.
Автоматическое создание Web-страниц с внедряемыми компонентами
Для облегчения процесса внедрения ActiveX-элементов управления в Web-страницы, в Delphi предусмотрена возможность для автоматической генерации HTML-файлов, содержащих внедряемые компоненты. Благодаря этому, при отладке работы элементов управления теряется необходимость в ручном редактировании HTML-документов, и программист всегда имеет под рукой готовый пример внедрения. Поэтому все, что остается ему сделать, — это перенести фрагмент сгенерированного кода, описывающего элемент OBJECT, в создаваемую Web-страницу.
Прежде чем генерировать Web-страницу, следует заполнить несколько следующих опций, открывающихся при выборе пунктов меню Project | Web Deployment Options...
Target Dir. Определяет местонахождение конечного каталога для создаваемого компонента.
Target URL. Содержит адрес сервера и название каталога, в котором будет находиться файл компонента, т. е. адрес, откуда будет скачан файл компонента. Это значение используется для заполнения атрибута codebase элемента OBJECT Web-страницы.
HTML Dir. Как следует из названия, здесь указывает каталог для получившегося файла HTML.
Use CAB file compression. Включает режим сжатия файлов. Поскольку браузеры, устанавливающие компоненты, имеют встроенную поддержку CAB (сокращение от англ, cabinet) компрессии, рекомендуется всегда включать данную опцию, т. к. это позволяет существенно снизить трафик.
Include file version number. Эта опция внедряет описание версии в файл компонента.
Auto increment release number. Посредством данной опции, при каждой компиляции компонента, его номер версии увеличивается на единицу, а создаваемая Web-страница запрашивает обновленную версию файла. Обратите внимание, что указание параметров Target Dir и HTML Dir на работе компонентов никак не сказывается. Эти значения необходимы только для того, чтобы компилятор знал, куда нужно поместить выходные файлы. Если разработка элементов управления ведется на локальном компьютере, то при инсталляции на сервере данного компонента его нужно просто переписать в каталог, открытый на чтение для клиентов, и внести коррективы, соответствующие конечному URL компонента, в HTML-файл.
Пример реализации элемента управления ActiveX
В контексте реализации нашей информационной системы создадим форму, являющуюся элементом управления ActiveX для локальной печати пользователем счета, выставляемого по результатам сделанных им заказов. На данном этапе форма должна содержать только элементы, необходимые для получения и отображения данных. Информация о заказчике будет передаваться серверу посредством сокетов, использование которых будет описано в гл. 13.
Замечание
Реализуемый в книге пример является учебным. При создании реальных систем следует соблюдать соответствие всем образцам документов, согласно принятым стандартам делопроизводства.
Поскольку создаваемый компонент уже имеет клиентскую сущность и запускается на его стороне, то он должен быть реализован как отдельный ActiveX-проект.
Давайте создадим новый ActiveX Form-проект. Для этого нужно выбрать следующую последовательность меню: File | New | ActiveX | ActiveX Form и заполнить появившееся диалоговое окно, как показано на рис. 12.3. Если у вас уже был открыт некий проект, то по нажатии кнопки ОК на экране появится сообщение, что новая форма не может быть добавлена в существующий проект, поскольку он не является библиотекой ActiveX. Для продолжения работы необходимо подтвердить создание нового проекта и закрытие старого.
В рабочей области нужно открыть модуль main и его форму, на которой размещаются компоненты (рис. 12.4).
<>
Рис. 12.3. Пример заполнения диалогового окна
Рис. 12.4. Вид формы и ее компонентов примера
Параметры элементов, расположенных на форме, можно устанавливать как угодно, но, в целях согласования со следующими листингами, названия некоторых объектов лучше согласовать с табл. 12.2.
Таблица 12.2. Описание ключевых компонентов на форме
Функциональная роль элемента | Тип | Название |
Поле ввода названия организации-заказчика | Edit | Custname |
Поле ввода адреса заказчика | Memo | Custaddress |
Область отображения позиций заказа | StringGrid | Items |
Кнопка Печать | Button | Printbtn |
Область, на которой распложены все остальные элементы | Panel | Panel |
После размещения элементов на форме можно установить параметры их отображения и значения по умолчанию.
Для того чтобы воспользоваться возможностями печати, необходимо подключить модуль printers к нашему модулю, вписав соответствующее название В секцию uses.
Теперь осталось обработать нажатие кнопки Печать. Следует помнить, что механизм получения конкретных значений заказа будет внедрен в наше ActiveX-приложение в ходе изложения материала последующих глав.
Для реализации первой задачи обработаем событие onPrintBtnCiick следующим образом (листинг 12.2).
Листинг 12.2. Реализация процедуры обработки нажатия кнопки Печать :
procedure Tshop. printbtnClick(Sender: TObject);
begin
printbtn. Hide;
print;
printbtn. show;
end;
Как обычно, чтобы вызвать заготовку для такой функции, нужно два раза щелкнуть мышью по соответствующей кнопке.
В приведенном листинге принтер печатает в графическом режиме. Для печати некоторого материала нужно вызвать свойство Canvas объекта Printer, которое позволяет рисовать необходимый к выводу на печать материал. В данном случае мы просто скопировали с "холста" формы область, занятую объектом Panel, в соответствующую область "холста" принтера, при этом сместив ее вниз и вправо на 20 пикселов, с целью формирования полей при печати. Методы BeginDoc и EndDoc, соответственно, активизируют рисование выводимого на печать материала на "холсте" принтера и отправляют его на печать.
Добавим свойство tabiecontent в нашу форму, которое устанавливается при ее вызове. Для этого, используя пункты меню Edit | Add to Interface, вызовем диалоговое окно и заполним его, как показано на рис. 12.5.
Рис. 12.5. Заполнение диалогового окна добавления нового свойства
После нажатия кнопки ОК следует реализовать появившуюся процедуру и функцию. Данные, на основании которых осуществляется представленный ниже разбор, будут получены в результате модифицирования нашего примера электронного магазина. Реализация процедуры, обрабатывающей значение, помещаемое в свойство tabiecontent, приведена в листинге 12.3.
Листинг 12.3. Реализация процедуры установки и получения свойства tabiecontent
procedure Tshop. Set_tablecontent(const Value: WideString);
var
Myrow: string;
count: byte;
begin
tmpvalue:=Value;
table. Rows [ 0 ] . Add (' Номер') ;
table. Rows[0].Add('Наименование товара');
table. Rows [ 0 ] . Add (' Количество') ;
table. Rows[0].Add('Цена, рублей');
table. Rows[0].Add('Стоимость');
delete(tmpvalue,1,(Pos('<TR>',tmpvalue)+3));
delete(tmpvalue,!,(pos('<TR>',tmpvalue)-1));
tmpvalue:=copy(tmpvalue,1,Pos('</TABLE>',tmpvalue)-1);
count:=1;
repeat
begin
delete(tmpvalue,1,(Pos('<TR>',tmpvalue)+3));
if pos('<TR>',tmpvalue)>0 then
myrow:=copy(tmpvalue,1,(Pos('<TR>',tmpvalue)-1))
else
myrow:=copy(tmpvalue,1,length(tmpvalue));
table. Rows [count ]_.Add (J£&&^l^&WL\y, Repeat
delete(myrow,1,(Pos('<TD>',myrow)+3));
if Pos('<TD>',myrow)>0 then
table. Rows [count] .Add (copy (myrow, 1, (Pos ('<TD>',myrow) -1)') )
else
table. Rows[count].Add(copy(myrow,1,length(myrow)));
until (Pos('<TD>',myrow)=0);
end;
count:=count+l;
until (Pos('<TR>',tmpvalue)=0);
end;
В данной процедуре происходит "очистка" самих данных от их HTML-представления и занесение конкретных значений в ячейки таблицы.
Для того чтобы дополнительно не модифицировать в значительной степени HTML-код серверной части, мы воспользуемся генератором корзины и эту информацию передадим в качестве параметра ActiveX-формы.
После того как все добавлено, можно устанавливать следующие обязательные параметры в меню Web Deployment Options:
Target Dir — выходной каталог на жестком диске для компилирования элемента управления.
Target URL — URL, который соответствует пути к папке на сервере, в которой будет размещен созданный элемент управления.
HTML Dir — каталог, в который следует помещать Web-страницу, предоставляющую пробный доступ к элементу управления.
После осуществления соответствующих настроек можно вызывать команду Web Deploy.
После ее выполнения в каталогах, которые вы определили для выходных файлов, появятся файлы bill. htm и bill. осх. Желательно сразу помещать эти файлы в каталог htdocs Web-сервера Apache.
Модернизация серверной части
В серверном модуле shop. dpr, который был реализован в предыдущей главе, следует сделать ряд изменений. Прежде всего, нужно описать класс TBiliview как наследник класса TBasicview, а затем реализовать отправку содержимого заказа клиенту.
Эти коррективы представлены в листинге 12.4.
Листинг 12.4. Модернизация проекта shop
function TBillView. CreateContent (const TagString: string) : String; var tag: string;
cart: tcartview; begin
cart:=tcartview. Create('templates\\Cart. htm'); cart. ForwardRequest(Request, Response); tag:=Response. Content;
{Здесь был использован объект "корзина" для генерации HTML-представления таблицы заказов. Следом идет отделение "лишней" информации — служебных тегов и т. д.}
tag:=copy(tag,26,Length(tag)-166);
while ((pos('<',tag) > 0) and (pos('>',tag) > 0)) do
begin
Insert('<',tag, Pos('<',tag));
Delete(tag, Pos('<',tag) ,1) ; Insert('>',tag, Pos('>', tag)) ;
Delete(tag, Pos('>',tag),1);
end;
while Pos( "" , tag)>0 do
begin
Insert('Squot;',tag, Pos('"',tag));
Delete(tag, Pos('"',tag),1);
end;
Result := '«OBJECT classid="clsid:9BC76146-CAAA4-3F14C6565152" codebase="http://localhost/bill. cab#version=l,0,0,0"'+ 'width=590 height=536 align=center hspace=0 vspace=0>'+ '<PARAM NAME="tablecontent" Value="'+tag+'"x/OBJECT>'; end;
Кроме сделанных изменений в реализации, следует внести коррективы в интерфейсную часть и процедуру обработки запросов пользователя. При описании реализации создаваемой системы в гл. 10были опушены сведения о классе TBiiivew. В листинге 12.5 приведен интерфейс для данного класса.
Листинг 12.5. Интерфейсная часть класса TBillVew
TBillView = class (TBasicView) public
function CreateContent (const TagString: string) : String;
override;
end;
В соответствии с дополнением системы возможностью генерации счета, необходимо провести модернизацию процедуры разбора запроса браузера клиента. Добавляемые В процедуру TDispatcher. CreateCorrespondingView строки кода приведены в листинге 12.6.
Листинг 12.6. Дополнение в процедуру TDispatcher. CreateCorrespondingView
else if position = 'order' then
result := TOrderView. Create ('templates\\0rder. htm') else if position = 'bill' then
result := TBillView. Create ('templates\\Bill. htm')
else
result := nil; ...
В результате, мы получили вариант электронного магазина, который уже позволяет печатать счет.
Перед тем как тестировать компонент, нужно запустить Web-сервер. Проверьте установки безопасности браузера. Он должен осуществлять загрузку неподписанных компонентов ActiveX.
Таким образом, был получен еще один фрагмент реализации информационной системы, на этот раз, работающий на стороне клиента. Дополнив его функциями получения данных заказа и отправки информации о клиенте, мы получим законченный клиентский модуль. Однако сначала нужно познакомиться со способом обмена данными, при котором уже не нужно пользоваться браузером или готовым Web-сервером, а именно на основе сокетов.
Введение в технологию ActiveX (серьезно, но с юмором)
В данный момент существует огромное количество литературы, в которой так или иначе описаны основные методы создания приложений с использованием технологии ActiveX.
Зачастую подробно описаны все ее прелести и удобства, но всегда кое-чего не хватает.
Особенно хорошо помняться те минуты, когда, имея на руках достаточно дорогую книгу, не удаеться разобраться в том, что там написано.
А все происходит потому, что у автора такой "маккулатуры" (конечно, есть также и очень достойные авторы) зачастую лишь одно желание - получить деньги за книгу, при этом не выдав "Тайну мальчиша Кибальчиша".
(Наверное, с умением программировать ко многим приходит и желание "зажилить" свои секреты, даже если они секретами не являються - извините за игру слов!).
Так что.... Я, конечно, не берусь написать нечто гениальное, но я хотя бы постараюсь изобразить технологию ActiveX на понятном для нормального человека языке. Ведь, когда я последний раз читал некоторую книгу (не станем упоминать автора) , то не раз казалось, что, не зная многого заранее, я бы не смог понять, что там написано. Да и просто скучно было читать сплошные термины!
Как принято в таких случаях говорить: "Начнем с самого начала"...
Уже сравнительно давно фирма Microsoft (не поминайте лихом, хотя Unix все-таки лучше) ввела в инструментарий программиста технологию OLE (не путать с женским именем!). Это дело по-английски звучит как "Object Linking and Embedding", что то же самое, как и наше "Внедрение и связывание обьектов" (почти как разновидность полового акта). Суть технологии состоит в том, что на любом (почти) из существующих языков программирования можно написать модуль, который будет потом использоваться как "кусок" окна другой программы. Это дело схоже с технологией создания DLL. Но, в отличии от последнего, имеется возможность реально увидеть написанное приложение. То есть, в отличии от DLL, компонент OLE является самостоятельным приложением, хотя и с особым способом вызова.
Согласно сложившейся терминологии, принято разделять компоненты OLE на приложения-серверы и приложения контейнеры.
Представьте себе программу, в окне которой мы будем отображать некий компонент. Эту программу называют контейнером. А компонент, который мы будем отображать, называют сервером. Если перейти на понятную всем терминологию "пальцев", то получим, что сервер - это девушка, она "дает", а контейнер - всего лишь "берет".
Добавьте сюда "женское имя" (от названия технологии OLE) - и вы получите незабываемый набор терминов!
А что же такое ActiveX? Это OLЯ для Интернет. Начиная с версии 3.0, появилось небольшое удобство. То есть возможность внедрять обьекты OLE в WEB-документы. А это дает немалые возможности! Вы можете разместить на Вашей странице обсолютно любой программный элемент! Это позволяет выйти за рамки HTML и скриптовых языков...
Как уже упоминалось выше, сегодня компоненты OLE могут быть написаны практически на любом языке программирования. Но, поскольку автор данной статьи предпочитает Visual C++, примеры будут написаны именно на нем. Если вам понадобяться советы по поводу другого языка - пишите нам. Мы постараемся помочь.
А поскольку самый понятный (и простой) С++ - это С++, основанный на MFC, то позволим себе и эту шалость. Учтем также и то, что ActiveX - разработка Microsoft. А поэтому и писать для него лучше будет в Microsoft Visual Studio.
Практическую часть вопроса начнем с написания сервера. Но сначала - анекдот....
В чем разница между блондинками и Интернет? Да ни в чем! Везде много пользователей...
Этот анекдот непосредственно связан с данной статьей. Действительно, компонент OLE (оно же ActiveX) может быть спокойнейшим образом использован любой желающей программой. И, хотя для него это не закончиться венерологическим диспансером, тут все-таки остаются некоторые нерешенные вопросы безопастности. Их мы обсудим в следующих статьях, посвященных ActiveX.
Итак......
Открываем Microsoft Visual C++.
Выбираем File->New.
Создаем MFC-Application с именем "Container Tester".
В Step1 выбираем "Single Document" и "Document/View Architecture Support" (программа, поддерживающая просмотр документов).
В Step2 выбираем "None", поскольку сейчас нас мало интересует работа с базами данных.
В Step3 выбираем "Container", "Automation", "ActiveX Controls" (собственно, мы только что выбрали то, что нас более всего интересовало - добавили поддержку технологии ActiveX).
То, что Вы выберете далее уже не важно - что кому больше понравиться. Основная часть работы уже сделана. Остаеться только нажать на кнопку "Finish". И, что замечательно для MFC, оно само позаботится о создании проэкта, который сразу же будет поддерживать все удобства контейнера ActiveX (будто ты только-только подошел к девушке, чтоб пригласить ее в театр, а она сразу стала раздеваться)....
Компилируем проэкт... Запустилось наше приложение. Кстати, не спешите его выбрасывать в корзину. Оно еще не раз пригодиться при написании сервера.
В только что созданной программе выбираем Edit -> Insert New Object. Вот Вы и получили возможность просмотреть/добавить любой из существующих ActiveX компонентов!
Простейший контейнер мы создали. Пока на этом закончим и перейдем к созданию пробного сервера.
Создаем MFC-приложение "AxtiveX Server".
В Step1 опять выбираем "Single Document" и "Document/View Architecture Support" (программа, поддерживающая просмотр документов).
На этот раз в Step3 выбираем "Full Server", "Automation", "ActiveX Controls".
Жмем "Finish" - и все готово.
Теперь, запустив уже созданный нами контейнер, мы можем добавлять в него элементы, которые будут являться документами нашего сервера.
Отредактировав класс просмотра Вашего сервера ("определив внешний вид документа"), Вы получите вставлять этот обьект куда угодно (и не только туда, где Вы подумали!). Конечно, для этого надо обладать некоторыми умениями работы с MFC. Но, это уже выходит за рамки рассмотрения технологии ActiveX. То есть не стоит "сразу с двумя девушками встречаться".
Чуть попозже я расскажу вам, детки, о том, как создавать по-настоящему полезный OLЯ-компонент.
Мы рассмотрим все на примере. Пишите нам, что бы вы хотели увидеть:
- рассылщик почты;
- калькулятор;
- сверщик пароля;
- прогноз погоды.
BYE!!!
Технология ActiveX
Разработка программного обеспечения, основанного на компонентах, в последнее время стала очень популярной. Популярность средств разработки приложений, предназначенных для компонентного программирования, таких как Visual Basic, Delphi и пр., продолжает расти. Добавим к этому стремительный рост Internet, где в WWW понятие программного компонента используется практически везде.
Программный компонент в терминах WWW - это апплет. Апплеты представляют собой небольшие и в большинстве случаев законченные приложения, первоначально находящиеся на сервере, но выполняющиеся в браузере клиента. Апплет не должен иметь большие размеры, так как, прежде чем выполняться, он загружается в клиентский компьютер. В среде WWW, где скорость передачи данных обычно невелика, чем меньше размер приложения, тем лучше.
Существует несколько способов разработки Web-компонентов. Их можно написать на Java, что даст возможность создать независимую от среды программу. Можно разработать подключаемые модули Netscape или элементы управления ActiveX.
Технология ActiveX разработана корпорацией Microsoft и основана на технологиях Component Object Model (COM) и Object Linking and Embedding (OLE, хотя после выхода версии 2.0 название перестало полностью отражать содержание). Практическая польза от применения ActiveX заключается в том, что любой компонент, разработанный по данной технологии в любой среде разработки на любом языке программирования, может использоваться так же любой средой разработки, поддерживающей ActiveX. Для примера: в Delphi 3.0 есть палитра Internet, полностью состоящая из ActiveX-компонент, разработанных на Visual Basic. Внедрение таких компонент должны поддерживать все приложения Windows (MS Office 97, IE с версии 3.01). Компоненты ActiveX можно также непосредственно внедрять в гипертекстовые Web-страницы. Это позволяет разработчику придавать прежде статическим страницам новые функциональные возможности.
Придание функциональности Web-страницам с помощью элементов ActiveX аналогично использованию апплетов Java. Однако благодаря тому, что элементы управления ActiveX дают разработчику полный доступ к функциям Win API, возможности их использования резко возрастают. Все, что можно сделать с помощью обыкновенного приложения Windows, можно сделать и с помощью элемента ActiveX. Этого нельзя сказать об апплете Java, в первую очередь из-за ограниченности его возможностей доступа к локальному компьютеру.
Однако здесь встает вопрос безопасности, который и разграничивает области применения Java-апплетов и ActiveX-компонент. При работе в среде Internet пользователю необходимо, чтобы страницы грузились быстро, и их содержимое не содержало "троянских коней" или других деструктивных компонент. Java-апплеты специально разработаны для этого, имеют небольшой размер и работают во всех современных браузерах. Их собратья ActiveX-компоненты "тяжелее", и поддерживает их использование только Microsoft Internet Explorer, хотя его доля по последним оценкам с учетом всех версий и доходит до 86% от используемых в Internet браузеров (КГ N№26 от 01.01.2001 г.). Для обеспечения безопасности корпорация Microsoft предлагает технологию Authenticode, позволяющую гарантировать корректность загружаемых компонентов. Она гарантирует не безопасность компонента, а то, что компонент загружается в том виде, в котором его создал разработчик, без изменений. Это аналогично тому, что когда вы покупаете лицензионное ПО, то у вас нет гарантии, что оно не нанесет вреда вашим данным, но есть доверие к производителю ПО. По сути Authenticode - это цифровая подпись, внесенная в компонент посредством механизма открытого/закрытого ключа.
Из всего этого следует, что в среде Internet технологии ActiveX сложно потеснить Java, но в среде intranet это вполне реально, т. к. здесь можно унифицировать клиентские платформы и все компоненты перед их использованием могут проверяться администратором на корректность. Вот на этот рынок и нацелена Microsoft, т. к. если на Internet можно зарабатывать большие деньги, то на корпоративных сетях intranet можно зарабатывать очень большие деньги.
Рынок intranet является таким же большим, как и рынок Internet. По некоторым исследованиям количество разработок, основанных на WWW и предназначенных исключительно для intranet, оценивается в 80%. Добавим сюда безмерную любовь западных разработчиков к Visual Basic - и картина сложится более-менее ясная. И напоследок несколько ссылок на ресурсы по теме:
http://www. /activex - раздел сайта Microsoft;
http://www. - библиотека компонент.


