Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Описание протокола DDE.doc
Скачиваний:
32
Добавлен:
01.05.2014
Размер:
70.66 Кб
Скачать

Void far* pDst,

DWORD cbMax,

DWORD cbOff

);

Функция должна получить на вход следующие параметры:

  • hData -  идентификатор порции данных в глобальной области памяти;

  • pDst – указатель на буфер, куда будут скопированы данные из глобальной области.

  • cbMax – размер буфера в байтах. Если фактический размер данных больше размера области в буфере, которая выделяется под эти данные(см. ниже параметр cbOff), то будут скопированы только первые (cbMaxcbOff) байт. Иначе функция скопирует все данные в буфер.

  • cbOff – смещение в буфере относительно начала, с которого функция поместит в буфер данные из глобальной области.

Функция возвратит количество фактически скопированных байт данных. Если вместо ссылки на буфер через параметр pDst передать нулевое значение, то функция вернет фактический размер порции данных в глобальной области памяти, при этом значение параметров cbMax и cbOff будут проигнорированы.

Канал связи DDE создается с помощью функции DdeConnect:

HCONV WINAPI DdeConnect(

DWORD idInst,

HSZ hszService,

HSZ hszTopic,

CONVCONTEXT FAR* pCC);

В качестве параметров функция должна получить следующее:

  • IdInst - программный идентификатор приложения, полученный при регистрации в библиотеке ddeml;

  • hszService – идентификатор строки названия сервиса, который необходимо предварительно получить вызовом функции DdeCreateStringHandle

  • hszTopic – идентификатор строки названия раздела, который также заранее запрашивается у библиотеки DDEML вызовом функции DdeCreateStringHandle;

  • pCC – указатель на специальную структуру типа CONVCONTEXT, в которой указывается информация о национальном языке и кодовой странице. В большинстве случаев (в нашем тоже) достаточно указать нулевое значение, что означает использование кодовой страницы ANSI.

Функция возвращает идентификатор созданного канала связи. В случае ошибки функция вернет нулевое значение. Полученный идентификатор канала необходимо хранить в течение всего сеанса связи.

Когда приложение завершает работу с каналом, оно должно закрыть его, вызвав функцию DdeDisconnect:

BOOL WINAPI DdeDisconnect(HCONV hConv);

В качестве параметра функция получает идентификатор канала, который нужно закрыть. Функция возвращает true, если канал успешно закрыт и false в случая возникновения ошибок при закрытии канала.

После того, как был создан канал связи, можно начинать обмен данными. Обмен происходит посредством транзакций с помощью функции DdeClientTransaction и функции обратного вызова DdeCallbackFunction. Если приложение (независимо от того, клиент или сервер) хочет отправить данные, то оно должно подготовить их, оформить контекст с помощью функций библиотеки DDEML , а потом вызвать функцию DdeClientTransaction. При этом принимающему приложению будет отправлено сообщение, которое осуществит вызов функцию обратного вызова принимающей стороны. Функции обратного вызова представляют особой обработчик с множественным ветвлением, каждая ветвь которого обрабатывает соответствующую ей транзакцию. Если транзакция не поддерживается, то функция обратного вызова должна вернуть нулевое значение, иначе – один из допустимых для обработанной транзакции, кодов возврата.

Функция обратного вызова имеет следующий заголовок:

HDDEDATA EXPENTRY  DdeCallbackFunction(

WORD wType,

WORD wFmt,

HCONV hConv,

HSZ hsz1,

HSZ hsz2,

HDDEDATA hData,

DWORD dwData1,

DWORD dwData2

);

где:

  • wType -  Код транзакции. Коды транзакций предопределены протоколом DDE. Значения и названия соответствующих им констант можно посмотреть в технической документации. Забегая вперед, отмечу, что в нашем примере будут использоваться транзакции XTYP_ADVSTART для запуска потока данных по каналу, XTYP_ADVSTOP – для остановки потока данных, XTYP_ADVDATA – транзакция с уведомлением наличии данных от сервера.

  • wFmt – формат данных (в нашем случае данные представляют собой текстовую строку, поэтому этому параметру при вызове будет присвоено значение CF_TEXT, равное единице).

  • hConv – идентификатор канала. Этот идентификатор получен при создании канала.

  • hsz1 – идентификатор строки названия раздела.

  • hsz2 – идентификатор строки названия элемента данных.

  • hData – идентификатор глобальной области в памяти, где находятся данные от сервера. Данные необходимо получить с помощью функции DdeGetData.

В свою очередь функция запуска транзакции DdeClientTransaction имеет следующий заголовок:

HDDEDATA WINAPI DdeClientTransaction(