- •Содержание
- •2 Вопросы для текущего контроля знаний по темам 70
- •Введение
- •1 Разработка приложений с элементами системного программирования на основе использования технологий межпрограммного обмена данными
- •1.1 Лабораторная работа №1. Обмен данными между потоками с использованием сообщения wm_copydata
- •Краткие теоретические сведения
- •1.1.2 Ход выполнения работы
- •1.1.3 Задание на лабораторную работу 1
- •Варианты индивидуального задания
- •1.1.4 Контрольные вопросы к лабораторной работе 1
- •1.2 Лабораторная работа №2. Обмен данными между приложениями с использованием технологии динамического обмена данными – Dynamic Data Exchange (dde)
- •1.2.1 Краткие теоретические сведения
- •Глобальные данные
- •Посылка и прием данных
- •Завершение сеанса
- •Компонент tddeServerConv
- •Компонент tddeServerItem
- •Компонент tddeClientItem
- •1.2.2. Ход выполнения работы
- •1.2.3 Задание на лабораторную работу 2
- •1.2.4 Контрольные вопросы к лабораторной работе 2
- •1.3 Лабораторная работа №3. Обмен данными между приложениями с использованием технологии динамического обмена данными с помощью файлов, отображаемых в память
- •1.3.1 Краткие теоретические сведения Создание объекта файлового отображения
- •Совместное использование отображаемых данных
- •1.3.2 Ход выполнения работы
- •1.3.3 Задание на лабораторную работу 3
- •1.3.4 Контрольные вопросы к лабораторной работе 3
- •1.4 Лабораторная работа №4. Обмен данными между приложениями с использованием технологии динамического обмена данными с помощью сокетов
- •1.4.1 Краткие теоретические сведения Сокеты
- •1.4.2 Ход выполнения работы
- •1.4.3 Контрольные вопросы к лабораторной работе 4
- •1.5 Лабораторная работа №5. Обмен данными между приложениями с использованием технологии динамического обмена данными с помощью именованных каналов
- •1.5.1 Краткие теоретические сведения Каналы
- •1.5.2 Ход выполнения работы
- •1.5.3 Контрольные вопросы к лабораторной работе 5
- •1.6 Лабораторная работа №6. Использование технологии сом при разработке приложений в Delphi. Создание и использование внутреннего сервера
- •1.6.1 Краткие теоретические сведения
- •1.6.2 Ход выполнения работы
- •1.6.3 Контрольные вопросы к лабораторной работе 6
- •2 Вопросы для текущего контроля знаний по темам
- •Список литературы
- •107/2009. Підп. До друку 25.12.09. Формат 60 х 84/8.
- •84313, М. Краматорськ, вул. Шкадінова, 72.
Глобальные данные
Клиент и сервер обмениваются данными, располагаемыми в глобальной памяти. Программа, посылающая информацию, выделяет память под объект следующим образом:
hData :=GlobalAlloc(GMEM_MOVEABLE OR GMEM_DDESHARE, dwBytes);
Начало сеанса
Существует три способа начала сеанса динамического обмена данными. В первом и втором случае указывается название приложения и темы. В третьем случае обмен осуществляется на основе данных, хранимых в области обмена данными (clipboard). Программа указывает название, тему и элемент для создания атомов, которые затем используются для начала сеанса. Приложение-клиент, которое является инициатором обмена, создает два атома (название и тема) и с помощью функции SendMessage передает сообщение wm_DDE_Initiate приложению-серверу. Обычно начало сеанса выглядит следующим образом:
Var
AppAtom, AppTopic: TAtom;
Begin
If Not LinkEstablished Then
Begin
AppAtom := GlobalAddAtom(ServerName);
AppTopic :=GlobalAddAtom(ServerTopic);
SendMessage(Word(-1),wm_DDE_lnitiate,hWindow, MakeLong(AppAtom, AppTopic));
GlobalDeleteAtom(AppAtom);
GlobalDeleteAtom(AppTopic);
End;
End;
Функция SendMessage возвращает результат только после обработки сообщения. Таким образом, вы можете быть уверены, что сеанс установлен перед вызовом функций удаления атомов. Значение первого параметра функции SendMessage указывает на то, что сообщение посылается всем окнам. Таким образом, любой DDE-сервер может его принять. Третий параметр - ссылка на окно, которое является клиентом DDE-сеанса. Эта ссылка используется сервером для посылки данных. Если сервер отвечает на запрос о начале сеанса, он посылает клиенту сообщение wm_DDE_Ack. Поле wParam этого сообщения содержит ссылку на окно приложения-сервера. Эта ссылка затем используется для общения с сервером. После того, как сеан установлен, приложения должны обмениваться сообщениями wm_DDE_xxx, но они должны посылаться с помощью функции PostMessage.
Посылка и прием данных
После того, как сеанс начат, клиент может послать сообщение wm_DDE_Request, означающее запрос информации от сервера. Это может выглядеть следующим образом:
Var
Appltem : TAtom;
Begin
Appltem :=GlobalAddAtom(ServerTopic);
if not PostMessage(hWndServer, wm_DDE_Request,
hWindow, MakeLong(cf_Text, Appltem)) then GlobalDelete(Appltem);
End;
После получения сообщения wm_DDE_Request сервер подготавливает сегмент глобальной памяти (вызов функции GlobalAlIoc), копирует необходимую информацию в этот сегмент и посылает ссылку на этот сегмент через сообщение wm_DDE_Data:
if not PostMessage(Msg.wParam,wm_DDE_Data,
hWindow, MakeLong(hData, AppTopic)) then
Begin
GlobalFree(hData);
GlobalDeleteAtom(AppTopic);
End;
Обычно используется то же название темы, что и при запросе, т.е.
AppTopic := HiWord(Msg.lParam);
После того, как обмен данными завершен, необходимо закончить сеанс обмена.