Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методическое пособие по СПр.doc
Скачиваний:
6
Добавлен:
16.12.2018
Размер:
690.69 Кб
Скачать

Глобальные данные

Клиент и сервер обмениваются данными, располагаемыми в гло­бальной памяти. Программа, посылающая информацию, выделяет память под объект следующим образом:

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);

После того, как обмен данными завершен, необходимо закон­чить сеанс обмена.