Как происходит обмен данными между различными приложениями Windows
Обновлено: 21.11.2024
Динамический обмен данными (DDE)
MATLAB предоставляет функции, которые позволяют MATLAB получать доступ к другим приложениям Windows, а другим приложениям Windows — получать доступ к MATLAB в широком диапазоне контекстов. Эти функции используют динамический обмен данными (DDE) — программное обеспечение, которое позволяет приложениям Microsoft Windows взаимодействовать друг с другом путем обмена данными.
В этом разделе описывается использование DDE в MATLAB:
Концепции и терминология DDE
Приложения взаимодействуют друг с другом, устанавливая диалог DDE. Приложение, которое инициирует диалог, называется клиент. Приложение, которое отвечает клиентскому приложению, называется сервером.
Когда клиентское приложение инициирует диалог DDE, оно должно указать два параметра DDE, определенные сервером:
-
Имя приложения, с которым оно намеревается вести диалог, называемое название службы. Тема диалога, называемая topic.
Когда серверное приложение получает запрос на диалог по поддерживаемой теме, оно подтверждает запрос, устанавливая диалог DDE. Сочетание услуги и темы однозначно идентифицирует разговор. Службу или тему нельзя изменить на время беседы, хотя служба может поддерживать более одной беседы.
Во время диалога DDE клиентское и серверное приложения обмениваются данными, касающимися элементов. Элемент – это ссылка на данные, которые важны для обоих приложений в диалоге. Любое приложение может изменить элемент во время разговора. Эти концепции более подробно обсуждаются ниже.
Имя службы
Каждое приложение, которое может быть сервером DDE, имеет уникальное имя службы. Имя службы обычно представляет собой имя исполняемого файла приложения без расширения. Имена сервисов не чувствительны к регистру. Вот некоторые часто используемые названия служб:
-
Имя службы для MATLAB — Matlab. Имя службы для Microsoft Word для Windows — WinWord. Имя службы для Microsoft Excel — Excel.
Названия служб других приложений Windows см. в документации по приложениям.
Тема определяет тему диалога DDE и обычно имеет значение как для клиентского, так и для серверного приложений. Названия тем не чувствительны к регистру. Темы MATLAB — System и Engine — обсуждаются в разделе Доступ к MATLAB как к серверу. Большинство приложений поддерживают тему Система и как минимум еще одну тему. Обратитесь к документации вашего приложения для получения информации о поддерживаемых темах.
Каждая тема поддерживает один или несколько элементов. Элемент идентифицирует данные, передаваемые во время диалога DDE. Чувствительность элементов к регистру зависит от приложения. Элементы MATLAB Engine чувствительны к регистру, если они относятся к матрицам, потому что имена матриц чувствительны к регистру.
Форматы буфера обмена
DDE использует форматы буфера обмена Windows для форматирования данных, пересылаемых между приложениями. Как клиент, MATLAB поддерживает только текстовый формат. В качестве сервера MATLAB поддерживает форматы Text, Metafilepict и XLTable, описанные ниже:
В Windows предусмотрено несколько способов передачи данных между приложениями. Одним из способов является использование протокола динамического обмена данными (DDE). Протокол DDE представляет собой набор сообщений и указаний. Он отправляет сообщения между приложениями, которые совместно используют данные, и использует общую память для обмена данными между приложениями. Приложения могут использовать протокол DDE для однократной передачи данных и для непрерывного обмена, при котором приложения обмениваются обновлениями по мере появления новых данных.
Windows также поддерживает библиотеку управления динамическим обменом данными (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
DDE лучше всего подходит для обмена данными, не требующего постоянного взаимодействия с пользователем. Обычно приложение предоставляет пользователю способ установить связь между приложениями, обменивающимися данными. Однако после установления связи приложения обмениваются данными без дальнейшего участия пользователя.
DDE можно использовать для реализации широкого спектра функций приложения, например:
- Связь с данными в режиме реального времени, такими как обновления фондового рынка, научные инструменты или управление технологическим процессом.
- Создание составных документов, таких как текстовый документ, содержащий диаграмму, созданную графическим приложением. При использовании DDE диаграмма изменится при изменении исходных данных, а остальная часть документа останется прежней.
- Выполнение запросов данных между приложениями, например, электронная таблица запрашивает базу данных для просроченных счетов.
Динамический обмен данными с точки зрения пользователя
Следующий пример иллюстрирует взаимодействие двух приложений DDE с точки зрения пользователя.
Пользователь электронной таблицы хочет использовать Microsoft Excel для отслеживания цены определенной акции на Нью-Йоркской фондовой бирже. У пользователя есть приложение под названием Quote, которое, в свою очередь, имеет доступ к данным NYSE. Диалог DDE между Excel и Quote происходит следующим образом:
- Пользователь инициирует беседу, указав название приложения (Quote), которое будет предоставлять данные, и конкретную интересующую тему (NYSE). Результирующий диалог DDE используется для запроса котировок по определенным акциям.
- Excel рассылает имена приложений и разделов всем приложениям DDE, работающим в данный момент в системе. Quote отвечает, устанавливая диалог с 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. |
ReturnMessage | Вспомогательная информация для последнего использовавшегося сообщения WM_DDE_ACK. Этот элемент полезен, когда требуется более восьми битов возвращаемых данных для конкретного приложения. |
Status | Индикация текущего состояния приложения. Когда сервер получает сообщение WM_DDE_REQUEST для этого системного элемента, он должен ответить, отправив сообщение WM_DDE_DATA со строкой, содержащей либо Busy, либо Ready, в зависимости от ситуации. |
SysItems< /td> | Список элементов системной темы, поддерживаемых приложением. |
TopicItemList | Аналогичен элементу SystemItems, за исключением того, что должен поддерживаться 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 td> | Инициирует диалог между клиентским и серверным приложениями. |
WM_DDE_POKE | Отправляет значение элемента данных серверному приложению. | td>
WM_DDE_REQUEST | Запрашивает серверное приложение предоставить значение элемента данных. |
WM_DDE_TERMINATE td> | Завершает диалог. |
WM_DDE_UNADVISE | Закрывает постоянный канал передачи данных. |