Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
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
- динамический обмен данными с точки зрения пользователя
- концепции динамического обмена данными
- Обзор сообщений динамического обмена данными
- поток сообщений динамического обмена данными
- функции упаковки параметров
- динамический обмен данными и олицетворение
Протокол динамического обмена данными
Так как 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 и Quote на тему NYSE, чтобы никакие конкретные ссылки данных на эту тему не могли быть установлены без инициирования новой беседы.
Основные понятия Динамического обмена данными
В следующих разделах описываются важные понятия и терминология, которые являются ключевыми для понимания динамического обмена данными.
- Клиент, Сервер и Беседа
- Названия приложений, тем и элементов
- Системная тема
- постоянные ссылки на данные
- Атомарные объекты и объекты общей памяти
Клиент, сервер и беседа
Считается, что два приложения, участвующие в DDE, находятся в DDE-диалоге. Приложение, инициирующее беседу, является клиентским приложением DDE; Приложение, которое отвечает клиенту, является серверным приложением DDE. Приложение может одновременно участвовать в нескольких беседах, выступая в качестве клиента в некоторых и как сервер в других.
Беседа DDE происходит между двумя окнами, по одному для каждого из участвующих приложений. Окно может быть главным окном приложения; окно, связанное с определенным документом, как в приложении многодокументного интерфейса (MDI); или скрытое (невидимое) окно, предназначенное только для обработки сообщений DDE.
Так как беседа DDE определяется парой идентификаторов окон, ведущих беседу, ни одно окно не должно участвовать в нескольких беседах одновременно с другим окном. Клиентское приложение или серверное приложение должно предоставлять другое окно для каждой беседы с определенным сервером или клиентским приложением.
Приложение может гарантировать, что пара окон клиента и сервера никогда не участвует ни в одной иной беседе, создавая отдельное скрытое окно для каждой беседы. Единственной целью этого окна является обработка сообщений DDE.
Имена приложений, разделов и элементов
Протокол DDE определяет единицы данных, передаваемые между клиентом и сервером, с трехуровневой иерархией приложений, разделов и имен элементов.
Каждая беседа DDE однозначно определяется именем приложения и разделом. В начале беседы DDE клиент и сервер определяют имя приложения и раздел. Имя приложения обычно является именем серверного приложения. Например, если Excel выступает в качестве сервера в беседе, имя приложения — Excel.
Раздел DDE — это общая классификация данных, в рамках которой во время обмена могут "обсуждаться" несколько элементов данных. Для приложений, работающих с документами на основе файлов, раздел обычно является именем файла. Для других приложений раздел — это имя конкретного приложения.
Поскольку дескрипторы окон клиента и сервера вместе определяют разговор DDE, имя приложения и тема, определяющие разговор, не могут быть изменены во время разговора.
Элемент данных DDE — это информация, связанная с темой беседы, обмененная между приложениями. Значения для элемента данных можно передавать с сервера на клиент или с клиента на сервер. Данные можно передавать с помощью любого из стандартных форматов буфера обмена или с зарегистрированным форматом буфера обмена. Специальный зарегистрированный формат с именем Link определяет элемент в беседе DDE. Дополнительные сведения о форматах буфера обмена см. в буфер обмена.
Системный раздел
Приложения всегда должны поддерживать системный раздел. В этом разделе содержится контекст сведений, которые могут быть общими интересами для другого приложения.
Значения элементов данных должны отображаться в формате буфера обмена CF_TEXT. Отдельные элементы значений элементов для системной темы должны быть разделены символами табуляции. В следующей таблице приведены некоторые элементы для системного раздела.
Пункт | Описание |
---|---|
Форматы | Список форматов буфера обмена, которые могут отображаться приложением, разделены табуляцией. Как правило, форматы CF_ перечислены без указания части имени "CF_" (например, CF_TEXT указан как "TEXT"). |
Помощь | Текст, кратко объясняющий, как использовать сервер DDE. |
Сообщение о возврате | Вспомогательная информация для наиболее недавно использованного сообщения WM_DDE_ACK. Этот элемент полезен, если требуются более восьми битов возвращаемых данных для конкретного приложения. |
Статус | Указание текущего состояния приложения. Когда сервер получает сообщение WM_DDE_REQUEST для этого элемента системного раздела, он должен реагировать, публикуя сообщение WM_DDE_DATA со строкой, содержащей либо "Занят", либо "Готово" в зависимости от ситуации. |
SysItems | Список элементов системного раздела, поддерживаемых приложением. |
СписокПредметовТемы | Аналогично элементу 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.
Сообщение | Описание |
---|---|
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 состоит из следующих событий:
Клиентское приложение инициирует беседу, а серверное приложение отвечает.
Приложения обмениваются данными с помощью любого или всех следующих методов:
-
- Серверное приложение отправляет данные клиенту по запросу клиента.
- Клиентское приложение отправляет незапрошенные данные в серверное приложение.
- Клиентское приложение запрашивает серверное приложение, чтобы уведомить клиента при изменении элемента данных (теплая ссылка на данные).
- Клиентское приложение запрашивает серверное приложение отправлять данные при каждом изменении данных (горячая ссылка на данные).
- Серверное приложение выполняет команду по запросу клиента.
-
Клиент или серверное приложение завершает беседу.
Окно приложения, обрабатывающее запросы от клиента или сервера, должно обрабатывать их строго в порядке их получения.
Клиент может устанавливать беседы с несколькими серверами; Сервер может иметь беседы с несколькими клиентами. При обработке сообщений из нескольких источников клиент или сервер должны синхронно обрабатывать сообщения беседы, но не обрабатывать все сообщения синхронно. Другими словами, он может перейти от одной беседы к другой по мере необходимости.
Если приложению не удается обработать входящий запрос, так как оно ожидает ответа 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.