Плещев В.В. Высокоуровневые методы информатики и программирования - файл n1.docx

приобрести
Плещев В.В. Высокоуровневые методы информатики и программирования
скачать (6381.5 kb.)
Доступные файлы (1):
n1.docx6382kb.08.07.2012 21:25скачать

n1.docx

1   ...   19   20   21   22   23   24   25   26   27

4.8. Технология применения объектов COM, DCOM


Объект COM (Component Object Model) представляет собой объект (EXE или DLLфайл) со своими свойствами и методами, который распространяется и встраивается (подобно компоненту) в приложение. Объекты Distributed COM (DCOM) дополнительно обеспечивают распределенную обработку в сети.

При создании приложения COM используются следующие понятия.

Интерфейс COM описывает методы и свойства, доступные клиентам через механизм публикации (регистрации в операционной системе). Базовый интерфейс имеет имя Iunknown, и его характеристики наследуются интерфейсамипотомками (имена интерфейсов начинаются с “I”). Каждый интерфейс имеет уникальный глобальный идентификатор длиной 16 байтов (GUID), а каждый интерфейс в объекте COM имеет идентификатор интерфейса IID на основе GUID. Благодаря наличию стандартных интерфейсов объект COM может быть реализован на любом языке.

Сервер COM представляет собой модуль (EXE или DLL) с программным кодом объектов COM. При обращении к серверу передается идентификатор GUID класса CLSID. Сервер создает специальный объект (фабрику классов ICLassFactory), который занимается созданием и загрузкой экземпляра нужного объекта COM.

Клиент COM является программой, обращающейся к серверу COM.

Пример создания объекта COM с методом умножения двух чисел

Выполним команду File/New/ActiveX/ActiveX Library. Добавим объект COM командой File/New/ActiveX/COM Object и настроим создаваемый объект (рис. 4.8.1): способ создания объекта Multiple instance (создание нескольких объектов), способ обращения к интерфейсу Apartment (для каждого объекта создается поток), краткое описание интерфейса (Description). После нажатия кнопки ОК формируются интерфейс и описание класса TMyObject, и появляется окно редактора библиотеки (рис.4.8.2).


Рис. 4.8.1. Окно настройки объекта COM
Окно редактора библиотеки можно вызвать и командой View/Type Library. Левая часть окна содержит дерево объектов, интерфейсов и методов. Выделим строку ImyObject, нажмем кнопку New Method и введем имя создаваемого метода GetMulti. Перейдем на страницу Parameters и кнопкой Add введем два параметра и укажем их имена и типы (рис. 4.8.2).

Рис. 4.8.2. Задание параметров метода GetMulti в интерфейсе объекта COM
Кнопкой New Property можно создать новые свойства объекта. Нажмем кнопку Refresh для обновления реализации.


Перейдем в модуль Unit1 и заполним тело метода кодом:

function TMyObject.GetMulti(X, Y: Single): Single; begin Result:=X*Y; end;

Перейдем в редактор библиотеки и нажмем кнопку Register. В результате выполняется компиляция, создается модуль Project_TLB.Pas, библиотека Project1.DLL и содержащийся в ней сервер COM регистрируется в системе. Закроем проект.

Для отладки объекта COM создадим новый проект (клиент COM) в другой папке (рис. 4.8.3).


Рис. 4.8.3. Окно проверки работы метода GetMulti объекта COM MyObject
Откорректируем модуль Unit1. В строку Uses добавим модуль Project1_TLB с описанием интерфейса. В подразделе Public раздела Type объявим глобальные переменные: UkazIUnknown, UkazIMyObject : IMyObject.

Добавим процедуру создания формы для установки связи с сервером:

procedure TForm1.FormCreate(Sender: TObject);

begin // создание подкласса Co с описанием общего интерфейса IUnknown

UkazIUnknown:=CoMyObject.Create; //указатель интерфейса IUnknown

// формирование указателя на интерфейс IMyObject

UkazIUnknown.QueryInterface(IMyObject,UkazIMyObject); end;

Составим процедуру нажатия кнопки Перемножить.

procedure TForm1.Button1Click(Sender: TObject);

begin Label1.Caption:= FloatToStr (UkazIMyObject.GetMulti (StrToFloat (Edit1.Text), StrToFloat(Edit2.Text))); end;

Выполним приложение.

4.9. Распределенные двухуровневые клиентсерверные приложения

4.9.1. Технология COM/DCOM с использованием сервера транзакций MTS


В данной технологии используется сервер транзакций MTS, который входит в поставку Webсервера Personal Web Server. Он позволяет организовать надежную работу серверов COM и клиентов COM (п. 4.8), выполняющихся на различных компьютерах [2; 7].

4.9.2. Технология CORBA


В данной технологии вместо сервера транзакций MTS используется брокер CORBA (Common Object Request Broker Architecture, общая архитектура брокеров объектных запросов). Брокеры объектных запросов позволяют организовать работу серверов COM и клиентов COM (п. 4.8), выполняющихся на различных компьютерах под управлением различных операционных систем (Windows, Unix и др.) [2; 7].

4.10. Распределенные многоуровневые приложения

4.10.1. Технология MIDAS


Чаще используется трехуровневая модель: клиентская программа (формирует запросы пользователя и отображает результаты их выполнения), сервер приложений (синхронизирует работу компонентов), сервер базы данных (обрабатывает запросы к данным от сервера приложений). В состав приложения MIDAS входят: удаленные модули данных (серверы COM или CORBA), поставщики данных (объекты, возвращающие по запросу результирующую информацию), компоненты связи, клиентские наборы данных (объекты клиентской программы обработки получаемых данных с использованием MIDAS.DLL). Компоненты технологии MIDAS находятся на одноименной панели [2; 7].

Схема работы приложения MIDAS [2; 7].

  1. Клиентская программа соединяется с сервером приложений и запрашивает данные у сервера.

  2. Сервер приложений обращает к серверу базы за данными, получает, упаковывает их в формате OleVariant(дельтанаборы),отсылает клиенту.

  3. Клиентская машина распаковывает, отображает данные, корректирует их и посылает новые данные серверу приложений.

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

Пример формирования итоговых полей таблицы строек с итоговыми значениями сметных и освоенных сумм по всем стройкам с использованием технологии MIDAS:

  1. Разместим в модуле данных компонент DataSetProvider, который организует обмен данными между клиентскими и внешними наборами данных. В свойстве DataSet укажем имя объекта Stroiki, ранее созданного в модуле базы (п. 3.3).


  2. Разместим в модуле данных компонент ClientDataSet, который поддерживает наборы клиента, независимые от типа СУБД и источника данных. Укажем свойство AggregatesActive=True и в свойстве ProviderName укажем имя предыдущего компонента. Через редактор полей (вызывается двойным щелчком по компоненту) добавим два новых итоговых поля SumSs, SumFs типа Aggregate (итоговое) со значением свойства Expression равным Sum(Ss) и Sum(Fs). Могут использоваться еще функции Avg (среднее), Count (число непустых значений поля), Max (максимальное), Min (минимальное). Не допускаются вложения функций и операций с отдельными полями. Укажем Active=True для этих полей.


  3. Разместим компонент DataSource со значением свойства DataSet=ClientDataSet1. Подключим модуль Modul2 к Modul1


  4. На форме разместим два компонента DBText со свойствами DataSource=DataModul2.DataSource1 и DataField равным SumSs, SimFs соответственно и компонент DBGrid для работы с таблицей.


  5. Выполним приложение. На форме появятся два итоговых числа.

4.10.2. Создание сервера приложений доступа к базе данных


Рассмотрим порядок создания на примере.

  1. Командой File/New Application создадим новый проект Poject1.

  2. Добавим командой File/New/Multitier/Remote Data Module проект с удаленным модулем данных, который будет обеспечивать связь с клиентскими программами. В поле CoClass Name введем имя интерфейса этого модуля (например, IStroiki) и нажмем кнопку OK. Появится окно модуля.

  3. На странице Components этого окна разместим компонент Table со свойствами: DatabaseName=Stroiki (псевдоним базы строек), TableName=Zakazhiki (таблица с заказчиками).


  4. Разместим компонент DataSetProvider (выполняет работу сервера приложений) со свойствами: DataSet=Table1. Для компонента Table1 установим свойство Active=True. Сервер будет постоянно находиться в оперативной памяти, обслуживая клиентские приложения в отличие от сервера транзакции MTS (он для каждого клиентского приложения запускает новый процесс, создавая новую копию объекта COM).


  5. Зарегистрируем сервер на компьютере, где он будет выполняться: командой Run/Parameters установим в поле Parameters значение /Register.

(отмена регистрации задается командой /Unregister) и выполним приложение Project1 (имя сервера приложений).

  1. Сохраним проект в папке с именем удаленного модуля данных DataModulStroikiUdal (вместо Unit2) и закроем проект.

4.10.3. Связь с сервером приложений по протоколу DCOM


Для проверки работы созданного в предыдущем пункте сервера приложений построим клиентское приложение доступа к данным.

  1. Командой File/New Application создадим новый проект.

  2. Разместим на форме компонент DCOMConnection (связь клиентской программы с сервером приложений на основе технологии DCOM) с панели Midas со свойствами: ServerName= Project1.Istroiki. Если указать свойство Connected=True, то сервер приложений (программа Project1.exe) автоматически запустится. И сервер закроется, если указать Connected=False. Мы оставим Connected=False.


  3. Разместим компонент ClientDataSet со свойствами: RemoteServer=DCOMConnection1, ProviderName=DataSetProvider1 (для автоматического запуска сервера приложений).


  4. Разместим компонент DataSource со свойством DataSet= ClientDataSet1.


  5. Разместим компонент DBGrid со свойством DataSource= DataSource1. Для компонента ClientDataSet1 установим свойство Active=True. Запустим клиентское приложение, и появится таблица.

4.10.4. Связь с сервером приложений по протоколу Интернет TCP/IP


Каждый компьютер в сети имеет IPадрес в виде четырех чисел (от 0 до 255), разделенных точками (IP  Internet Protocol). Например, IPадрес локального компьютера клиента имеет адрес 127.0.0.1 и имя Localhost. Для передачи информации в Интерненте используется протокол TCP/IP (TCP  Transport Control Protocol, протокол транспортного управления). Работа с протоколом TCP/IP основана на технологии сокетов (Sockets). Сокет представляет собой окончание сетевого соединения с другим компьютером в прикладной программе, с которым устанавливается соединение перед и закрывается после передачи данных (аналогично файлу).

Изменим в клиентском приложении (п. 4.10.2) установку связи с сервером по протоколу DCOM на протокол TCP/IP.

  1. Откроем проект клиентского приложения и разместим на форме компонент SocketConnection установки связи с сервером по протоколу PCP/IP. В свойстве Address указывается IPадрес удаленного компьютера сервера приложений. Для отладки укажем адрес локального компьютера 127.0.0.1. В свойстве ServerGUID указывается идентификационный номер GUID сервера приложений (п. 4.10.1). Скопируем его одноименные свойства компонента DCOMConnection1 через буфер, предварительно указав для него свойство Connected=False. После этого свойству ServerName присвоится имя сервера Project1.IStroiki.


  2. Для организации связи запустим специальную программу Delphi5\Bin\ScktSrvr.exe. На панели индикации Windows появится ее отображение в виде значка. После двойного щелчка по этому значку появится окно Borland Socket Server. Если флажок меню Connections/Register Objects Only установлен, то нужно его сбросить и перезапустить эту программу. В поле GUID введем (вставим из буфера) значение свойства ServerGUID. Нажмем кнопку Apply.


  3. Для компонента SocketConnection1 для запуска сервера приложений установим свойство Connected=True.

  4. Для компонента ClientDataSet1 установим свойства RemoteServer=SocketConnection1 и Active=True.

  5. Выполним клиентское приложение, и появится таблица.

Копии этого приложения могут запускаться на разных компьютерах, соединенных по протоколу TCP/IP при условиях, что в программах указаны верные IPадреса и на сервере была запущена программа ScktSrvr.exe.

4.10.5. Связь с сервером приложений по протоколу HTTP


Технологии DCOM и TCP/IP требуют установки прямой связи между клиентом и сервером, что в перегруженных сетях может вызвать большие задержки в установке такой связи. В таких случаях лучше использовать компонент WebConnection с панели Midas, который организует связь с сервером по протоколу передачи гипертекста HTTP в Интернете со средствами защиты данных. При отсутствии реального Webсервера можно создать для отладки собственный Webсервер на локальном компьютере. Для этого нужно присвоить уникальное сетевое имя компьютеру:


  1. Выполним команду Пуск/Настройка/Панель управления/Сеть.

  2. На странице Конфигурация выберем протокол TCP/IP и нажмем кнопку Свойства.

  3. На странице Конфигурация DNS установим флажок Включить DNS. В поле Имя компьютера установим, например, MyHost, а в поле Домен  MyDomain.ru. Перегрузим компьютер.

Изменим в клиентском приложении (п. 4.10.2) установку связи с сервером по протоколу DCOM на протокол HTTP.

  1. Разместим компонент WebConnection. В свойстве ServerGUID этого компонента указывается идентификационный номер GUID сервера приложений (п. 4.10.1). Скопируем его одноименное свойство компонента DCOMConnection1 через буфер, предварительно указав для него свойство Connected=False. После этого свойству ServerName присвоится имя сервера Project1.IStroiki.

  2. Запустим Webсервер, если он еще не запущен. Скопируем библиотеку Delphi5\Bin\httpsrvr.dll в виртуальный каталог Webсервера, допускающий вызов серверных приложений, например: Cgi-Bin. В свойстве URL компонента WebConnection1 укажем полный адрес этой библиотеки, например, http://myhost/cgi-bin/httpsrvr.dll и Connected=True. Произойдет запуск сервера приложений.

  3. Для компонента ClientDataSet1 установим свойства RemoteServer=WebConnection1 и Active=True и выполним клиентское приложение.



4.10.6. Основы разработки приложений Internet


Предполагается, что пользователь имеет базовые понятия об языке разметки гипертекстa HTML [8] (этот пункт подготовлен А. Кочетовым).

Протокол HTTP, язык HTML и универсальный локатор ресурса URL составляют основу WWW [4]. HTTP (HyperText Transfer Protocol) - протокол передачи гипертекста, основанный на идее “ссылки”, реализованной в универсальном идентификаторе ресурса (URL) и универсальном имени ресурса (URN). Второй основной частью протокола HTTP является идея запроса-ответа.

Динамически формируемые Webдокументы создаются сервером в процессе обработки клиентского запроса. Серверные программы, выполняющие эту функцию, подразделяются на два типа: Web-сервер может вызывать исполняемую программу или поручить это дело вызываемой процедуре из библиотеки динамической загрузки (DLL). Delphi поддерживает все четыре интерфейса приложений, выполняемых на сервере и позволяющих создавать динамические документы HTML: ISAPI и NSAPI (использует .DLL), CGI и Win-CGI (использует .EXE). Исходный текст для всех интерфейсов может быть один. Различия лишь при создании “проекта”, т.е. имея исходный код приложения CGI, вы можете получить приложение интерфейса ISAPI, лишь создав таковое (File/New/Web Server application/ISAPI) и перенеся код. Никаких изменений не требуется.

Пример создания Web-приложения типа CGI вывода текущего времени (рис. 4.10.6.1):

Рис. 4.10.6.1. Окно приложения

1. Выберите пункт меню File/New/Web Server application/CGI. Мастер создаст для вас приложение и WebModule, который является потомком TDataModule и наследует его свойства, и если вы имели проект по работе с базами данных с использованием TDataModule, то вы можете произвести публикацию данных в Internet, лишь добавив в DataModule компонент WebDispatcher. Он же и встроен в TWebModule.

2. Дважды щелкните в Инспекторе Объектов на свойстве Actions. Добавьте новую строку в таблицу действий кнопкой Add New.

3. Дважды щелкните на событии OnAction. Отредактируйте текст обработчика так, как он представлен ниже:

Procedure TWebModule1WebActionItem1Action(Sender:TObject;

Request:TwebRequest; Response:TwebResponse; var Handled:Boolean);

Begin

{ Sender - определяет вызвавший его объект.

Request - содержит запрос пользователя.

Response - содержит ответ сервера.

Handled - флаг, определяющий обработано или нет событие.

}

Response.Content:=’

Пример приложения CGI

’+

Текущее время: ‘+ TimeToStr(SysUtils.Time) +’’;

End;

4. Сохраните проект и откомпилируйте (^F9).

5. Поместите EXE-файл приложения в “исполняемый каталог” вашего Web-сервера (Wins2000)

6. Выполните EXE-файл приложения, указав его имя в поле Адрес проводника Интернета.
Одна из популярных задач Internet  это получение каких-либо данных от клиента, обработка на сервере и отправка клиенту документа-ответа. В HTML-документах это обычно решается при помощи формы. Сервер обрабатывает события OnAction, которые, в свою очередь, получают два параметра-объекта Response и Request. Если форма использует метод Post, то данные помещаются в свойство ContentFields. Если в запросе применяется метод Get, то данные запроса будут находиться в свойстве QueryFields.

Рассмотрим общую структуру приложения Web-сервера. Когда приложение получает от Web-клиента запрос, оно создает объекты TwebRequest и TWebResponse для размещения в них HTTP-запроса и ответа сервера соответственно. Затем эти объекты передаются диспетчеру Web, встроенному в Web-модуль или компоненту TWebDispatcher. Диспетчер поддерживает набор объектов-действий классов TwebActionItem, каждый из которых выполняет обработку различных видов запросов. Этот класс имеет свойство MethodType, предоставляющее различные варианты обработки запроса: mtGet, mtHead, mtPost, mtPut, mtAny. Запрос считается обработанным, если возвращается значение true через параметр Handled; также возможна обработка событий BeforeDispatch, AfterDispatch.

На инструментальной панели Internet имеется три компонента, предназначенные для работы с базами данных в приложениях для Web-серверов:

TqueryTableProducer  используется для представления в виде HTML-таблицы результата SQL-запроса к базе данных. Этот объект может получать параметры SQL-запроса из HTTP-запроса. Если запрос использует метод Post, то параметры запроса по SQL помещаются в свойство ContentFields. Если в запросе применяется метод Get, то данные запроса будут находиться в свойстве QueryFields.

TdataSetTableProducer  занимается аналогичным делом, но используя объект TDataSet.

TdataSetPageProducer  заменяет шаблоны в заготовке HTML-документа на значения соответствующих полей базы данных. При этом используются значения полей текущей записи базы данных.

Пример создания Web-приложения просмотра таблицы базы данных (рис. 4.10.6.2):

Рис. 4.10.6.2. Окно просмотра таблицы базы данных

1. Создадим для базы данных алиас средствами Администратора BDE непосредственно на сервере.

2. Создадим новое Web-приложение.

3. Поместим в модуль компонент TTable и подключим его к заранее созданной таблице базы данных (установим свойства Database и TableName соответствующие значения). В свойстве Database укажем алиас БД или ее полный путь, а в TableName соответственно имя таблицы.

  1. Добавим на форму компонент TDataSetTableProducer.

  2. Создадим объект-действие со свойствами PathInfo=’’, Enabled=true.

  3. Редактором столбцов компонента TDataSettableProducer проведем настройку оформления таблицы, заголовков (рис. 4.10.6.3). Изменения видны непосредственно в этом же редакторе.


Рис. 4.10.6.3. Окно редактора столбцов таблицы базы данных


7. Свяжем объекты DataSetTableProducer1 и Table1. Для этого укажем имя Table1 в свойстве DataSet поставщика данных. В свойствах Footer и Header задаются необходимые заголовочные и заключительные теги, чтобы получить корректный HTML-документ, понятный броузеру Web. В нашем случае можно использовать следующий фрагмент:

Для Header:

DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 3.2//EN”>

Пример 2

Для Footer:

BODY> HTML>

8. Затем щелкнем на свойстве Columns. Отбираем нужные поля для вывода в таблицу. Кроме этого можно дать имена для выводимых колонок и настроить цвет и обрамление. Заметим, что компонент TqueryTableProducer работает и настраивается аналогично.

9. Введем следующий код в обработчик созданного ранее события:

procedure TwebModule1WebActionItem1Action(Sender:TObject;

Request:TwebRequest; Response:TwebResponse; var Handled:Boolean);

Begin

Response.Content:=DataSetTableProducer1.Content;

{Содержимому ответа сервера присваивается содержимое компонента типа TDataSetTableProducer}

Response.SendResponse; //отправляет ответ пользователю

End;

В этом примере клиент может отправить запрос к базе данных на наш сервер и получить всю информацию базы данных в окне броузера.

Однако наше приложение посылает всегда одно и то же и никакого диалога с пользователем не ведет. Это можно исправить, используя публикацию данных в стиле навигатора: пользователь сможет перемещаться по таблице, используя ссылки “вперед”, “назад” и т.д. Все это и многое другое мы можем реализовать при помощи компонента TdataSetPageProducer. Этот компонент работает с компонентами TDataSet и имеет свойство HTMLDoc формата Tstrings. Он заполняется текстом вашего документа, а также шаблонами (<#шаблон>), которые, если и имеют одинаковые имена с полями таблицы/запроса, указанные в свойстве DataSet, то они заменяются на значение соответствующего поля текущей записи источника данных или чем-либо иным при условии, что вы это запрограммировали в обработчике события OnHTMLTag.

Пример создания Web-приложения типа CGI просмотра таблицы базы данных (рис. 4.10.6.4):


Рис. 4.10.6.4. Окно просмотра таблицы базы данных
1. Помещаем в WebModule объект TTable.

2. Создадим объекты-действия с именем first, next, previous и с соответствующими значениями PathInfo и свойством Enabled=true, также объект-действие initial с пустым значением PathInfo.

3. Свяжем объекты DataSetPageProducer1 и Table1. Для этого укажем свойство DataSet=Table1.

4. Теперь сформируем вышеупомянутое свойство HTMLDoc.















Код<#KOD>

Наименование <#NAIM>



первая
<#CCC>предыдущая <#BBB>следующая
1   ...   19   20   21   22   23   24   25   26   27


4.8. Технология применения объектов COM, DCOM
Учебный материал
© nashaucheba.ru
При копировании укажите ссылку.
обратиться к администрации