Ожидая завершения асинхронной транзакции, функция
DdeClientTransaction() входит в цикл и производит опрос сообщений каждого
из окон, что позволяет клиенту продолжать реагировать на команды пользова-
теля, ожидая ответа на транзакцию. Однако в течение этого периода клиент не
может выполнить другую DDEML-функцию.
Кроме того, попытка вызвать функцию DdeClientTransaction() завершает-
ся неудачно, если у того же самого клиента в данный момент выполняется
другая, синхронная транзакция.
Чтобы отменить асинхронную операцию, не дожидаясь ее завершения,
следует вызвать функцию DdeAbandonTransaction(). При этом DDEML осво-
бождает все ресурсы, связанные с транзакцией, и отменяет результаты, воз-
вращенные сервером. (Аналогичный процесс происходит по истечении време-
ни, отведенного на выполнение синхронной транзакции.)
При асинхронной транзакции DDEML предоставляет клиентской функции
обратного вызова дескриптор объекта данных. Когда функция обратного вызова
возвращает результат, DDEML резонно предполагает, что данные больше не нуж-
ны, и автоматически освобождает объект данных. Если клиент хочет сохранить
данные, он должен их скопировать с помощью функции DdeGetData().
Как объяснялось ранее, обычная последовательность инициации диалога
предполагает, что клиент знает заранее, какие ему нужны cервисы и/или темы.
Чтобы предоставить клиентам возможность просмотреть все доступные темы,
DDE-серверы иногда содержат для каждого сервиса тему, которая называется sys-
tem. С помощью этой темы обеспечивается поддержка набора стандартных эле-
ментов. Кроме того, тема system позволяет клиенту получить информацию о кон-
кретном сервисе [2].
Строки, идентифицирующие стандартные системные элементы, опреде-
ляются в виде констант в файле DDEML.H. Три из них должны обязательно
поддерживаться всеми серверными приложениями:
SZDDESYS_ITEM_FORMATS – список строк, разделенных символами
табуляции и указывающих форматы буфера обмена, которые поддерживаются
данным сервером (имя элемента задается строкой «Formats»);
SZDDESYS_ITEM_SYSITEMS – список элементов, поддерживаемых сер-
вером в теме system (имя элемента задается строкой «SysItems»);
SZDDESYS_ITEM_TOPICS – список тем, поддерживаемых сервером (имя
элемента задается строкой «Topics»).
Кроме этих трех элементов темы system, DDEML-сервер поддерживает
в каждой теме еще один стандартный элемент:
SZDDE_ITEM_ITEMLIST– список элементов темы, отличной от system
(имя элемента задается строкой «TopicItemList»).
В ответ на запрос этих элементов сервер должен соединить все имена те-
мы, элемента или формата в одну длинную строку, используя в качестве раз-
делителей символы табуляции. Из этой строки сервер создает объект данных
и возвращает библиотеке DDEML дескриптор этого объекта в качестве резуль-
тирующего значения в ответ на сообщение XTYP_REQUEST.
Затем клиент
выделяет данные из этого объекта, разбивает список на составные части
128