Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции Delphi (Колосов).pdf
Скачиваний:
77
Добавлен:
11.05.2015
Размер:
2.57 Mб
Скачать

25.2. Динамический обмен данными

Динамический обмен данными (Dynamic Data Exchange – DDE) является одним из первых протоколов обмена данными в системе Windows. На его основе были созданы протоколы OLE (Object Link and Embedding – связывания и внедрения объектов) сначала версии 1.0, а затем 2.0.

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

Для создания сервера на страничке компонент System имеются два компонента: TDDEServerConv и TDDEServerItem. Для получения доступа к сервису DDE–сервера клиенту нужно знать несколько параметров:

имя сервиса (Service Name) – это имя приложения (сервера) с путем к нему;

имя темы (Topic Name);

имя элемента данных (Item Name).

Объект TDDEServerItem связывается с TDDEServerConv и определяет, что будет пересылаться по DDE. Для этого у него есть свойства Lines и Text. При изменении значений этих свойств происходит автоматическая пересылка обновленных данных во все приложения–клиенты, которые установили связь с сервером по данной теме. Обработка сообщений от клиентов производится в обработчике события OnPokeData объекта TDDEServerItem.

Для создания клиента используются компоненты TDDEClientConv и TDDEClientItem. Установление связи с сервером во время выполнения программы осуществляется методом SetLink с передачей ему имен сервиса и темы. Передача данных серверу осуществляется методом PokeDataLines с передачей имени элемента данных и собственно самих данных. Получение данных от сервера происходит в методе обработки события OnChange объекта

TDDEClientItem.

25.3. Совместное использование общей памяти

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

системе Windows 98 это файл win386.swp, в системе Windows NT/XP – pagefile.sys). С его помощью система производит страничную перекачку память–файл и файл–память. Неактивные программы вытесняются на диск, а активные помещаются в физическую память компьютера. Когда памяти в компьютере не хватает, то можно наблюдать постоянную работу жесткого диска по перемещению данных из памяти в файл подкачки и обратно.

126

Такой файл можно создать и в Delphi–программе с помощью функций

Windows API (Application Interface):

CreateFileMapping – создание файла подкачки;

MapViewFile – получение доступа к данным файла;

UnMapViewFile – прекращение доступа к данным файла подкачки.

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

25.4. Каналы

Протокол DDE уже пережил период своего расцвета, на смену ему пришел сетевой протокол NDDE (NetWork DDE), однако и ему уже пришел на смену механизм каналов – pipes. Это основной протокол работы клиент– серверных приложений для Microsoft SQL Server. Канал можно представить себе как среду, через которую обмениваются два приложения. Будем рассматривать только именованные каналы, т.е. имя канала является одним для всех приложений, участвующих в обмене данными. Имя канала записывается в соответствии с соглашением UNC (Universal Naming Convention). Оно может выглядеть так: \\<имя сервера>\<каталог>\<имя канала>.

Для создания сервера используется специальная функция Windows API – CreateNamedPipe. Клиент подключается к уже созданному каналу с помощью функции ConnectNamedPipe. Дальнейшая работа с каналом напоминает работу с обычным файлом. Для этого используются функции ReadFile и WriteFile.

Отключение от канала осуществляется функцией DisConnectNamedPipe. Каналы хорошо приспособлены для работы в локальной сети, однако в

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

25.5. Сокеты

Сокеты отличаются от каналов тем, что поддерживают работу всех протоколов глобальной сети Internet. Общепринятой и стандартизованной на международном уровне является семиуровневая модель структуры протоколов связи под названием модель взаимодействия открытых систем (Open System Interface – OSI). На каждом из уровней, от первого – физического до высших уровней, решается свой круг задач и используются свои инструменты. Роль каждого уровня – предоставлять определенный интерфейс протоколам следующего уровня. Перечислим эти уровни:

1)физический – на нем происходят преобразование бит в электромагнитный сигнал при передаче данных и обратное преобразование при приеме. Здесь все реализуется аппаратно, программные интерфейсы и протоколы отсутствуют;

127

2)канальный – обеспечивает связь между физическими устройствами в рамках одной сети;

3)сетевой – это уровень межсетевого общения;

4)транспортный – это уровень поддержки интернет–протоколов (IP). Основу этих протоколов составляют TCP (Transmission Control Protocol) и UDP (User Datagram Protocol);

5)cессионный – обеспечивает управление диалогом двух взаимодействующих сторон;

6)представлений – на нем решается задача приведения форматов данных к форматам, понятным приложениям высшего уровня.

7)приложений – на нем приложения обмениваются данными по глобальной сети.

Сокеты находятся над транспортным уровнем, а над ними – протоколы сеансового уровня, которые ориентированы на решение конкретных задач или сервисов Интернета. Например:

FTP – сервис передачи файлов,

HTTP – сервис передачи гипертекстовых страничек (Интернет–страниц),

SMTP и POP3 – сервисы электронной почты и т.д.

Сокеты позволяют, не вдаваясь в детали передачи информации,

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

В Delphi имеется огромный выбор средств для работы на уровне сокетов. Во–первых, можно впрямую использовать Windows API. Все процедуры и функции для этого даны в модуле WinSock.pas. Исторически первыми компонентами для работы с сокетами были TClientSocket и TServerSocket. Их описание дано в модуле ScktComp.pas. Но в последних версиях Delphi появились более универсальные компоненты TTCPClient, TTCPServer и TUDPSocket (модуль Sockets.pas). Одновременно в палитре компонентов Delphi появились целые страницы компонентов Indy (Internet Direct).

Механизм соединения при помощи сокетов следующий. На клиентском конце создается сокет, для инициализации связи ему задается путь к серверному сокету, с которым мы хотим установить соединение. В сетях TCP/IP путь задается двумя параметрами: адресом или равноценным ему именем хоста и номером порта. Хост – это система, в которой запущено приложение, содержащее сокет. Адрес хоста задается в виде четырех цифр в диапазоне от 0 до 255, разделенных точками. Вместо адреса можно задать имя хоста согласно правилам UNC (Universal Naming Convention), например http://bsuir.unibel.by. Соответствие адреса и имени хоста поддерживается специальным сервисом DNS (Domain Naming System). У компонента клиента адрес сервера задается двумя свойствами: Address и Port. На стороне сервера запускается свой сокет, который прослушивает (listening) состояние порта связи. После получения запроса от клиента устанавливается связь. Одновременно на сервере создается новый сокет для продолжения прослушивания.

128

В заключение можно сделать вывод, что сокеты – это основа создания Интернет–приложений или Web–служб.

26. ТЕХНОЛОГИЯ COM

Модель объектных компонент – COM (Component Object Model) является базовой технологией операционной системы Windows. Это дальнейшее развитие технологии DDE, а затем и OLE. Технология COM представляет собой строго регламентированную спецификацию, определяющую требования к взаимодействующим программам. Она позволяет легко общаться программам, созданным на разных языках программирования и выполняющимся как на одном, так и на разных компьютерах.

Ключевым моментом, на котором основана модель COM, является понятие интерфейса.

26.1. Интерфейс

Интерфейс – это определение методов и свойств, которые могут быть реализованы классом. Все методы в интерфейса рассматриваются как виртуальные и абстрактные по определению. Первоначально определенный интерфейс нельзя изменять в дальнейшем. Любое внесение изменений в интерфейс дает уже другой интерфейс. Каждый интерфейс определяется специальным, глобальным идентификатором – GUID (Global Unique IDentifier)

– шестнадцатибайтовым числом. Для интерфейсов такой идентификатор носит название IID (Interface Identifier). В Delphi при нажатии клавиш Ctrl+Shift+G

новый GUID формируется автоматически по специальным правилам, исключающим повторение значения GUID–а. Интерфейсы могут наследоваться. Прародителем всех интерфейсов является IUnKnown – неизвестный. В Windows он определен следующим образом:

Type IUnknown = interface ['{00000000-0000-0000-C000-000000000046}'] // GUID интерфейса

function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; function _AddRef: Integer; stdcall;

function _Release: Integer; stdcall; end;

Первая функция получает в качестве входного параметра идентификатор интерфейса. Если реализация такого интерфейса существует, то функция:

а) возвращает ссылку на него в параметре Obj;

б) вызывает метод _AddRef полученного интерфейса; в) возвращает 0.

В противном случае функция возвращает код ошибки – ENOINTERFACE. Функция _AddRef увеличивает счетчик ссылок на интерфейс на единицу

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

129

В модуле System.pas объявлен класс TInterfaceObject, реализующий интерфейс IUnknown и его методы. Кроме того, поддержка интерфейсов реализована в базовом классе TObject.

Реализацией интерфейса в Delphi всегда выступает класс. Для этого в объявлении класса необходимо указать, какие интерфейсы он реализует. Например:

Type TMyClass=Class(TComponent, IMy1Interface, IMy2Interface) // Реализация методов

end;

В данном примере класс TMyClass является наследником класса TComponent и он реализует два интерфейса: IMy1Interface и IMy2Interface. Таким образом, класс поддерживает множественное наследование интерфейсов и единичное наследование классов. Когда класс реализует интерфейс, он ответственен за реализацию всех методов не только этого интерфейса, но и методов всех предков интерфейса.

Имя интерфейса принято начинать с буквы «I». Зарегистрированные в системе IID и имена интерфейсов хранятся в ветке реестра –

HKEY_CLASSES_ROOT\Interface.

26.2. COM–сервер

COM–сервер – это специальным образом оформленное и зарегистрированное приложение, которое позволяет клиентам запрашивать создание реализованных в сервере объектов. Сервер может быть выполнен в виде либо динамической библиотеки (*.dll), либо исполняемого файла (*.exe).

Сервер в виде dll всегда выполняется в адресном пространстве активизировавшего его приложения. При этом производится быстрый вызов методов, но он менее надежен, так как не защищен от ошибок вызывающего его приложения.

Сервер в виде exe файла представляет собой обычный исполняемый файл, в котором реализована возможность создания COM–объектов по запросу клиента. Примером такого сервера может служить пакет Microsoft Office, приложения которого являются COM–серверами.

COM реализует механизм автоматического поиска серверов по запросу клиента. Каждый COM–объект имеет уникальный идентификатор Class Identifier (CLSID), построенный так же, как и GUID. Все COM–объекты регистрируются ОС Windows в ветке реестра HKEY_CLASSES_ROOT\CLSID.

Для каждого сервера здесь прописывается информация нужная для нахождения и загрузки его модуля, соответствующее «дружественное» имя или

Programmatic Identifier (PROGID).

Серверы в виде исполняемых файлов автоматически регистрируются в системе при первом запуске программы на компьютере. Для регистрации DLL– серверов используется программа Regsvr32 из системы Windows или процедура

RegisterCOMServer из поставки Delphi.

Windows – многозадачная и многопоточная среда с вытесняющейся многозадачностью. Для COM это означает, что клиент и сервер могут оказаться

130

в разных процессах или потоках и нужно обеспечить обращение к серверу множества клиентов в непредсказуемое время. Технология COM решает эту проблему с помощью «комнат» (Apartments), в которых выполняются COM– клиенты и COM–серверы. Комнаты бывают однопоточные (Single Threaded Apartment – STA) и многопоточные (Multiple Threaded Apartment – MTA).

При STA COM создает невидимое окно и при вызове любого метода COM–сервера Windows посылает сообщение этому окну с помощью функции PostMessage. Таким образом, образуется очередь сообщений для данного сервера. Это позволяет не заботиться о синхронизации методов и при этом нет опасности одновременного доступа нескольких методов к одному полю.

Для MTA в одной «комнате» может быть сколько угодно потоков и объектов, но при этом надо заботиться о синхронизации вызовов методов. Разработка таких серверов сложна, но они обладают более высоким быстродействием.

Для EXE–серверов клиент и сервер находятся в разных адресных пространствах. Для их взаимодействия в «комнате» клиента создается представитель сервера – Proxy, который представляет собой объект, экспортирующий запрошенный интерфейс. Одновременно в комнате сервера создается объект–заглушка (Stub), принимающий вызовы от proxy и транслирующий их в вызовы сервера. Процесс обмена между клиентом и сервером называется Marshalling. При этом клиент и сервер могут находиться на разных компьютерах.

Процесс запуска COM сервера по запросу клиента происходит следующим образом:

1)в реестре по запрошенному CLSID ведется поиск записи регистрации сервера;

2)из этой записи получаем имя исполняемого модуля сервера;

3)если это – исполняемый файл, то он запускается на выполнение. Любое приложение, реализующее COM–сервер, при старте регистрирует в системе интерфейс «фабрики объектов». После запуска и регистрации COM получает ссылку на «фабрику объектов»;

4)если это – DLL, то она загружается в адресное пространство вызвавшего процесса и вызывается ее функция DLLGetClassObject, возвращающая ссылку на реализованную в DLL «фабрику объектов»;

5)«фабрика объектов» – это COM–сервер, реализующий интерфейс IClassFactory. Ключевым методом этого интерфейса является CreateInstance, который и создает экземпляр требуемого объекта;

6)COM вызывает метод CreateInstance и передает полученный интерфейс клиенту.

Для создания COM–сервера в Delphi нужно в меню пройти путь:

File New ActiveX

На страничке ActiveX находятся значки для управления процессом создания различных видов COM–объектов. Можно создать COM–сервер в виде EXE–файла путем добавления COM–объекта к текущему проекту. Для создания COM–сервера в виде DLL–библиотеки можно выбрать значок ActiveX Library.

131