Поделиться через


Сведения о динамическом обмене данными

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

Windows также поддерживает библиотеку управления Динамическими данными Exchange (DDEML). DDEML — это библиотека динамической компоновки (DLL), которую приложения могут использовать для совместного использования данных. DDEML предоставляет функции и сообщения, упрощающие задачу добавления возможности DDE в приложение. Вместо отправки, публикации и обработки сообщений DDE непосредственно приложение использует функции DDEML для управления беседами DDE. (Беседа DDE — это взаимодействие между клиентскими и серверных приложениями.)

DDEML также предоставляет возможность управления строками и данными, которыми совместно используются приложения DDE. Вместо использования атомов и указателей на объекты общей памяти приложения DDE создают и обмениваются дескрипторами строк, которые определяют строки и дескрипторы данных, которые определяют объекты памяти. DDEML также позволяет серверу приложению регистрировать поддерживаемые им имена служб. Имена передаются другим приложениям в системе, которые могут использовать имена для подключения к серверу. Кроме того, DDEML обеспечивает совместимость между приложениями DDE, заставляя их реализовать протокол DDE согласованно.

Существующие приложения, использующие протокол DDE на основе сообщений, полностью совместимы с теми, которые используют DDEML. То есть приложение, использующее DDE на основе сообщений, может устанавливать беседы и выполнять транзакции с приложениями, использующими DDEML. Из-за многих преимуществ DDEML новые приложения должны использовать его, а не сообщения DDE. Чтобы использовать элементы API DDEML, необходимо включить файл заголовка DDEML в исходные файлы, связаться с библиотекой DDEML и убедиться, что библиотека динамической компоновки DDEML находится в пути поиска системы.

В этом разделе рассматриваются следующие разделы.

Протокол динамического обмена данными

Так как Windows имеет архитектуру на основе сообщений, передача сообщений является наиболее подходящим методом автоматического передачи информации между приложениями. Однако сообщения содержат только два параметра (wParam и lParam) для передачи данных. В результате эти параметры должны косвенно ссылаться на другие части данных, когда между приложениями передается более нескольких слов информации. Протокол DDE определяет, как приложения должны использовать параметры wParam и lParam для передачи больших фрагментов данных с помощью глобальных атомов и дескрипторов общей памяти. Протокол DDE имеет определенные правила для выделения и удаления глобальных атомов и объектов общей памяти.

Глобальный атом — это ссылка на символьную строку. В протоколе DDE атомы определяют приложения, обменивающиеся данными, характер обмена данными и сами элементы данных. Дополнительные сведения об атомах см. в разделе "О атомах".

Используется для Windows Dynamic Data Exchange

DDE наиболее подходит для обмена данными, которые не требуют постоянного взаимодействия с пользователем. Обычно приложение предоставляет пользователю метод для установления связи между приложениями, обменивающимися данными. Однако после установки этой ссылки приложения обмениваются данными без дальнейшего участия пользователей.

DDE можно использовать для реализации широкого спектра функций приложения, например:

  • Связывание с данными в режиме реального времени, такими как обновления фондового рынка, научные инструменты или управление процессами.
  • Создание составных документов, таких как текстовый документ, содержащий диаграмму, созданную графическим приложением. С помощью DDE диаграмма изменится при изменении исходных данных, а остальная часть документа остается той же.
  • Выполнение запросов данных между приложениями, например электронной таблицы, запрашивающей базу данных для учетных записей, прошедших из-за выполнения.

Динамический обмен данными из точки зрения пользователя

В следующем примере показано, как два приложения DDE могут сотрудничать, как показано на основе точки зрения пользователя.

Пользователь электронной таблицы хочет использовать Microsoft Excel для отслеживания цены определенной акции на Нью-йоркской фондовой бирже. Пользователь имеет приложение с именем Quote, которое, в свою очередь, имеет доступ к данным NYSE. Беседа DDE между Excel и Quote происходит следующим образом:

  • Пользователь инициирует беседу, указав имя приложения (цитата), которое будет предоставлять данные и конкретную тему интереса (NYSE). Результирующая беседа DDE используется для запроса цитат по определенным акциям.
  • Excel передает имена приложений и разделов всем приложениям DDE, работающим в настоящее время в системе. Цитата отвечает, устанавливая беседу с Excel о теме NYSE.
  • Затем пользователь может создать формулу электронной таблицы в ячейке, которая запрашивает автоматические обновления электронной таблицы при изменении определенной кавычки акций. Например, пользователь может запросить автоматическое обновление всякий раз, когда изменение происходит в цене продажи акций ZAXX, указав следующую формулу Excel: ='Quote'|' NYSE'! ZAXX
  • Пользователь может завершить автоматическое обновление цены акций ZAXX в любое время. Другие ссылки на данные, созданные отдельно (например, для цитат для других акций), по-прежнему будут оставаться активными в той же беседе NYSE.
  • Пользователь также может завершить всю беседу между Excel и Кавычками в разделе NYSE, чтобы не было никаких определенных ссылок данных на эту тему, не инициируя новую беседу.

Основные понятия Динамического обмена данными

В следующих разделах описываются важные понятия и терминология, которые являются ключевыми для понимания динамического обмена данными.

Клиент, сервер и беседа

Говорят, что два приложения, участвующие в DDE, участвуют в беседе DDE. Приложение, инициирующее беседу, является клиентским приложением DDE; Приложение, которое отвечает клиенту, является серверным приложением DDE. Приложение может одновременно участвовать в нескольких беседах, выступая в качестве клиента в некоторых и как сервер в других.

Беседа DDE происходит между двумя окнами, по одному для каждого из участвующих приложений. Окно может быть главным окном приложения; окно, связанное с определенным документом, как в приложении многодокументного интерфейса (MDI); или скрытое (невидимое) окно, предназначенное только для обработки сообщений DDE.

Так как беседа DDE определяется парой дескрипторов в окнах, участвующих в беседе, окно не должно заниматься несколькими беседами с другим окном. Клиентское приложение или серверное приложение должно предоставлять другое окно для каждой беседы с определенным сервером или клиентским приложением.

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

Имена приложений, разделов и элементов

Протокол DDE определяет единицы данных, передаваемые между клиентом и сервером, с трехуровневой иерархией приложений, разделов и имен элементов.

Каждая беседа DDE однозначно определяется именем приложения и разделом. В начале беседы DDE клиент и сервер определяют имя приложения и раздел. Имя приложения обычно является именем серверного приложения. Например, если Excel выступает в качестве сервера в беседе, имя приложения — Excel.

Раздел DDE — это общая классификация данных, в которой во время беседы могут быть "обсуждаться" (обмен несколькими элементами данных). Для приложений, работающих с документами на основе файлов, раздел обычно является именем файла. Для других приложений раздел — это имя конкретного приложения.

Так как окно клиента и сервера вместе определяет беседу DDE, имя приложения и раздел, определяющие беседу, нельзя изменить во время беседы.

Элемент данных DDE — это информация, связанная с разделом беседы, обменився между приложениями. Значения для элемента данных можно передавать с сервера на клиент или с клиента на сервер. Данные можно передавать с помощью любого из стандартных форматов буфера обмена или с зарегистрированным форматом буфера обмена. Специальный зарегистрированный формат с именем Link определяет элемент в беседе DDE. Дополнительные сведения о форматах буфера обмена см. в разделе "Буфер обмена".

Системный раздел

Приложения всегда должны поддерживать системный раздел. В этом разделе содержится контекст сведений, которые могут быть общими интересами для другого приложения.

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

Позиция Description
Список типов Список форматов буфера обмена с разделителями табуляции может отображаться приложением. Как правило, CF_ форматы перечислены с частью "CF_" удаленных имен (например, CF_TEXT отображается как "TEXT").
Справка Текст, кратко объясняющий, как использовать сервер DDE.
ReturnMessage Вспомогательная информация для последнего использованного сообщения WM_DDE_ACK . Этот элемент полезен, если требуются более восьми битов возвращаемых данных для конкретного приложения.
Состояние Указание текущего состояния приложения. Когда сервер получает сообщение WM_DDE_REQUEST для этого элемента системного раздела, оно должно реагировать, публикуя сообщение WM_DDE_DATA со строкой, содержащей значение "Занят" или "Готово" в соответствии с соответствующим образом.
SysItems Список элементов системного раздела, поддерживаемых приложением.
TopicItemList Аналогично элементу SysItems, за исключением того, что TopicItemList следует поддерживать для каждого раздела, отличного от системного раздела. Это позволяет просматривать элементы, поддерживаемые в любом разделе. Если элементы не удается перечислить, этот элемент должен содержать только "TopicItemList".
Темы Список разделов, поддерживаемых приложением в настоящее время; этот список может отличаться от момента до момента.

 

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

Существует два типа постоянных каналов данных DDE: теплые и горячие. В теплой связи с данными сервер уведомляет клиента о том, что значение элемента данных изменилось, но сервер не отправляет значение данных клиенту, пока клиент не запрашивает его. В горячей связи с данными сервер немедленно отправляет измененное значение данных клиенту.

Приложения, поддерживающие теплые или горячие каналы данных, обычно предоставляют команду "Копировать " или "Вставить ссылку " в меню "Изменить ", чтобы разрешить пользователю устанавливать связи между приложениями.

Атомы и объекты общей памяти

Некоторые аргументы сообщений DDE — это глобальные атомы или объекты общей памяти. Приложения, использующие эти аргументы, должны следовать явным правилам о том, когда следует выделять и удалять их. Во всех случаях отправитель сообщения должен удалить любой атом или объект общей памяти, который предполагаемый получатель не получит из-за состояния ошибки, например сбоя функции PostMessage.

DDE использует объекты общей памяти для трех целей:

  • Для обмена значением элемента данных. Это элемент, на который ссылается параметр hData в WM_DDE_DATA и сообщениях WM_DDE_POKE.
  • Для переноса параметров в сообщении. Это элемент, на который ссылается параметр hOptions в сообщении WM_DDE_ADVISE .
  • Для переноса строки выполнения команды. Это элемент, на который ссылается параметр hCommands в сообщении WM_DDE_EXECUTE и соответствующее WM_DDE_ACK сообщение.

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

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

Общие сведения о сообщениях Обмена динамическими данными

Так как DDE является протоколом на основе сообщений, он не использует функции или библиотеки. Все транзакции DDE выполняются путем передачи определенных сообщений DDE между окнами клиента и сервера.

Существует девять сообщений DDE; Символьные константы для этих сообщений определены в файле заголовка DDE. Некоторые структуры для различных сообщений DDE также определены в этом файле заголовка.

В следующей таблице перечислены сообщения DDE.

Message Description
WM_DDE_ACK Подтверждает получение или отсутствие сообщения.
WM_DDE_ADVISE Запрашивает серверное приложение для предоставления обновления или уведомления для элемента данных при каждом изменении. При этом устанавливается постоянная ссылка на данные.
WM_DDE_DATA Отправляет значение элемента данных клиентскому приложению.
WM_DDE_EXECUTE Отправляет строку в серверное приложение, которое, как ожидается, обрабатывает строку в виде ряда команд.
WM_DDE_INITIATE Инициирует беседу между клиентскими и серверными приложениями.
WM_DDE_POKE Отправляет значение элемента данных в серверное приложение.
WM_DDE_REQUEST Запрашивает серверное приложение для предоставления значения элемента данных.
WM_DDE_TERMINATE Завершает беседу.
WM_DDE_UNADVISE Завершает постоянную ссылку на данные.

 

Приложение вызывает SendMessage, чтобы выдать сообщение WM_DDE_INITIATE или сообщение WM_DDE_ACK, отправленное в ответ на WM_DDE_INITIATE. Все остальные сообщения отправляются PostMessage. Первым параметром этих вызовов является дескриптор в окне получения; второй параметр содержит сообщение, которое нужно отправить; третий параметр определяет окно отправки; и четвертый параметр содержит аргументы, относящиеся к сообщению.

Поток сообщений Динамического обмена данными

Типичная беседа DDE состоит из следующих событий:

  1. Клиентское приложение инициирует беседу, а серверное приложение отвечает.

  2. Приложения обмениваются данными с помощью любого или всех следующих методов:

      • Серверное приложение отправляет данные клиенту по запросу клиента.
      • Клиентское приложение отправляет незапрошенные данные в серверное приложение.
      • Клиентское приложение запрашивает серверное приложение, чтобы уведомить клиента при изменении элемента данных (теплая ссылка на данные).
      • Клиентское приложение запрашивает серверное приложение отправлять данные при каждом изменении данных (горячая ссылка на данные).
      • Серверное приложение выполняет команду по запросу клиента.
  3. Клиент или серверное приложение завершает беседу.

Окно приложения, обрабатывающее запросы от клиента или сервера, должно обрабатывать их строго в порядке их получения.

Клиент может устанавливать беседы с несколькими серверами; Сервер может иметь беседы с несколькими клиентами. При обработке сообщений из нескольких источников клиент или сервер должны синхронно обрабатывать сообщения беседы, но не обрабатывать все сообщения синхронно. Другими словами, он может перейти от одной беседы к другой по мере необходимости.

Если приложению не удается обработать входящий запрос, так как он ожидает ответа DDE, он должен предотвратить взаимоблокировку, разместив сообщение WM_DDE_ACK с членом fBusy структуры DDEACK, равным 1. Приложение также может отправлять занятое сообщение WM_DDE_ACK , если по какой-либо причине он не может обрабатывать входящий запрос в течение разумного периода времени.

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

Функции упаковки параметров

Параметр lParam для многих сообщений DDE содержит два фрагмента данных. Например, lParam сообщения WM_DDE_DATA содержит дескриптор данных и атом. Приложения должны использовать функцию PackDDElParam для упаковки дескриптора и атома в параметр lParam, а также функцию UnpackDDElParam для удаления значений. Приложения DDE должны использовать PackDDElParam и UnpackDDElParam для всех сообщений, размещенных во время беседы DDE.

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

Динамический обмен данными и олицетворение

Чтобы разрешить серверу олицетворить клиент, клиент вызывает функцию DdeSetQualityOfService. Структура SECURITY_IMPERSONATION_LEVEL используется для управления уровнем олицетворения сервера.

Сервер DDE может олицетворить клиент DDE, вызвав функцию ImpersonateDdeClientWindow. Сервер DDEML должен использовать функцию DdeImpersonateClient.