С какими приложениями windows можно устанавливать dde связь

Обновлено: 04.07.2024

Продукты корпорации Microsoft поддерживают протокол динамического обмена данными - DDE (протокол - правила при коммуникациях). С использованием папки обмена CLIPBRD.EXE выполняются DDE -связи в компьютерной сети (стартует сетевая DDE -служба), при этом данные должны быть сделаны доступными - должен быть реализован общий доступ . В процессе обмена данными устанавливаются связи между папками обмена удалeнных компьютеров; данные буфера обмена должны находиться на страницах папки обмена. Такая связь может быть реализована и средствами Visual Basic . Приложения могут выполнять как роль клиента, запрашивающего и принимающего данные, так и роль сервера - источника данных.

Технология обмена данными между приложениями развита до такого уровня, что данные не нужно заново копировать - они после их изменения автоматически передаются через DDE - связь . OLE - следующий этап разработок в области обмена данных. Это технология связи программ, обеспечивающая приложениям совместное использование данных. Технология OLE поддерживается с помощью внедрённых и связанных объектов . Развитие OLE - это технология ActiveX.

Рассмотрим примеры использования Microsoft Access в роли сервера DDE для приложения-клиента, запрашивающего и принимающего даные по каналу связи DDE . Сеанс связи начинается с открытия канала связи; при этом используется функция DDEInitiate, в аргументе которой перечисляются: имя приложения ( база данных Access), имя файла базы данных , имя таблицы ; пример: intChan1 = DDEInitiate("MSAccess", "C:\Winnt\Profiles\Administrator\dde6;TABLE dde1")

После этого становится возможной передача данных в другое приложение по этому каналу. Для передачи требования на пересылку, например, текстовых данных из приложения-сервера по открытому каналу DDE используется функция DDERequest , в аргументе которой указывается номер канала связи и сформулирован запрос , пример: strResp1 = DDERequest(intChan1, "All") . После окончания передачи данных нужно вызвать в приложении-клиенте функцию DDETerminate для закрытия текущего канала обмена или функцию DDETerminateAll для закрытия всех каналов связи.

Практическая работа 40. DDE

40а. DDE. Простейший пример обмена данными

Задание: записать в файл результат запроса к данным таблицы базы данных (Access).

  1. создать базу данных (здесь - dde6), таблицу (здесь - dde1), сделать запрос, закрыть приложение Access,
  2. создать макрос в приложении Word, код макроса дан ниже,
  3. стартовать макроc; в результате его выполнения стартует закрытое ранее приложение Access,
  4. открыть файл dde61.txt (в редакторе Блокнот).

Содержимое полученного файла dde61.txt - это результат запроса ("All"): вывести всeсодержимое таблицы базы данных, рис. 6.1.

Простейший пример DDE; данные, выводимые в файл


Рис. 6.1. Простейший пример DDE; данные, выводимые в файл

40в. DDE

Приводится аналогичный пример; создаются 4 таблицы: student, (рис. 6.2, рис. 6.3) stipendija, sessija, prikaz; выполняются 4 запроса (рис. 6.4, рис. 6.5), создается макрос в приложении Word (см. код, данный ниже), открываются 4 канала связи, результаты 4-х запросов по 4-м каналам связи выводятся в файлы dde621 - dde624. Пояснения к коду макроса:

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

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

протокол Exchange платформа динамических данных

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

использование для Windows платформа динамических данных Exchange

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

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

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

платформа динамических данных Exchange с точки зрения пользователя

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

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

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

основные понятия Exchange платформа динамических данных

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

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

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

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

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

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

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

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

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

Раздел System

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

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

Постоянные ссылки на данные

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

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

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

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

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

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

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

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

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

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

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

    Клиент или серверное приложение завершает диалог.

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

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

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

    платформа динамических данных Exchange и олицетворение

    Чтобы разрешить серверу олицетворять клиента, клиент вызывает функцию ддесеткуалитйофсервице . Для управления уровнем олицетворения, который может выполнять сервер, используется структура _ _ уровня олицетворения безопасности .

    Сервер DDE может олицетворять клиент DDE, вызывая функцию имперсонатеддеклиентвиндов . Сервер ДДЕМЛ должен использовать функцию ддеимперсонатеклиент .

    Организуем запрос реальных значений каналов узла разработанного проекта приложением MS Windows в качестве, которого выберем книгу MS Excel. Для этого выполним:

    · запуск приложения MS Excel;

    · запишем в двух ячейках первого столбца запросы на получение данных:

    =RTM0|GET!Параметр

    =RTM0|GET!Управление

    где 0 – индивидуальный номер узла в проекте;

    · запустим на исполнение узел АРМ RTM _1;

    · в меню таблицы MS Excel Правка выберем команду Связи, выделим оба параметра и нажмем кнопку Обновить, после чего закроем окно кнопкой ОК.

    Убедимся, что значения в ячейках книги Excel изменяются вместе с соответствующими реальными значениями каналов узла (значения канала Параметр меняется постоянно, а канала Управление – после введения нового значения с помощью ГЭ Кнопка):


    МРВ как DDE-клиент


    где в атрибуте Имя:

    · Excel – имя приложения;

    · Sheet1 – имя листа книги MS Excel;

    · R3C3 – адрес ячейки.

    ADVISE – режим посылки клиенту значения при каждом его изменении.

    После необходимо создать канал класса Float типа Input с именем Из_таблицы и привязать к нему с помощью механизма drag - and - drop источник Excel . Sheet 1. R 3 C 3. После процедур сохранения проекта и подготовки его к запуску в реальном времени запустим MS Excel, а затем узел АРМ RTM _1. Вводя в ячейку R 3 C 3 произвольные значения, их можно наблюдать в атрибутах канала Из_таблицы с помощью окна просмотра компонентов, открываемого через основное меню отладчика:


    Таким образом, в результате будем наблюдать следующее:


    Подключение реального внешнего модуля ввода сигналов

    Введем в созданный проект модуль удаленного ввода I -7017 с подключенным к одному из его входов задатчиком напряжения. Предварительно настроим модуль с помощью конфигурационной утилиты, поставляемой с модулем на указанную характеристику, зададим «инженерный» формат вывода данных, присвоим ему номер в сети RS -485 равный 1 и установим формат обмена данными 57600,n,8,1 без контрольной суммы. Подключим модуль к порту СОМ1 компьютера через автоматический конвертор интерфейсов I -7520, обеспечим питание обоих модулей.

    Создание канала аналогового ввода данных от модуля I-7017

    Создать один DCS-модуль аналогового ввода:

    открыть слой Источники/приемники и через ПК создать в нем группу Распределенное УСО ( DCS ):


    двойным щелчком ЛК открыть группу Распределенное УСО ( DCS )_1 и через ПК создать в ней группу I -7000;





    В данной статье я хочу поделиться решением, которое наверняка будет многим полезно. Началось с того, что передо мной была поставлена задача организовать чтение данных из книги MS Excel, причем данные из ячеек нужно было считывать только в том случае, если они изменились. При этом были выдвинуты жесткие требования к скорости и оперативности обработки информации в изменившихся ячейках.

    2. Описание протокола DDE.

    Начнем с кратного описания протокола DDE. Материал статьи охватывает только ту часть API протокола, которая необходима для организации "горячего" канала DDE.

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

    Клиентское приложение также сначала регистрирует себя в библиотеке DDEML. После этого клиентское приложение создает канал связи с сервером.

    Протокол DDE поддерживает три вида обмена данными между клиентом и сервером:

    • По явному запросу
    • "Теплый канал"
    • "Горячий канал"

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

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

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

    На практике, как правило, используется либо передача данных по явному запросу, либо "горячий канал", причем второй очень удобен при организации быстрого обмена данными между приложениями в режиме реального времени. Именно "горячий" канал и будет рассматриваться в этой статье.

    В библиотеке DDEML данные адресуются трехступенчатой схемой: сервис (service), раздел (topiс) и элемент данных (data item). Для сервера DDE приложения MS Excel, эта схема выглядит следующим образом:

    Для установления связи, приложение должно сначала зарегистрировать себя в библиотеке DDEML и получить свой программный идентификатор. Этот идентификатор необходимо хранить в течение всей работы, так как для каждого приложения, которое регистрируется в библиотеке DDEML, создается своя копия необходимых структур данных.

    Параметры, которые передаются функции при вызове:

    • pidInst - ссылка на переменную типа <двойное слово>, в которую функция запишет программный идентификатор, присваиваемый приложения библиотекой DDEML. Перед вызовом функции программа должна обнулить значение этой переменной.
    • pfnCallback - указатель на функцию обратного вызова.
    • afCmd - набор битовых флагов инициализации, а также устанавливающий некоторые специфические условия работы с библиотекой.
    • ulRes - зарезервировано и должно быть равно нулю.

    В случае успешной регистрации, функция DdeInitialize возвращает нулевое значение. Если при инициализации произошла ошибка, то функция вернет код ошибки.

    Если приложение больше не собирается работать с библиотекой DDEML, то оно должно вызвать функцию DdeUninitialize, передав ей в качестве параметра программный идентификатор, полученный при регистрации:

    После успешной инициализации, клиентское приложения должно создать канал связи с сервером. Для каждого сервиса и раздела создается свой канал связи. После успешного создания канала, ему присваивается идентификатор, который указывается в дальнейших транзакциях, как клиентом, так и сервером.

    Адресация происходит посредством строк, однако в транзакциях используются их идентификаторы. Эти идентификаторы присваиваются каждой строке библиотекой DDEML и хранятся в специальной системной таблице идентификации строк. Для создания идентификатора строки, необходимо воспользоваться функцией DdeCreateStringHandle:

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

    • idInst - программный идентификатор приложения, полученный при регистрации в библиотеке DDEML;
    • psz - адрес текстовой строки, завершенной двоичным нулем. Длина строки не должна превышать 255 байт.
    • iCodePage - кодовая страница, определяющая тип строки, получаемой на вход. При указании константы CP_WINANSI данная строка рассматривается как строка ANSI. Если указать константу CP_WINUNICODE, то строка рассматривается как состоящая из символов Unicode.

    Функция возвращает идентификатор, который библиотека DDEML присвоила данной строке.

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

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

    Функция возвращает значение true, если операция прошла успешно, и false - если при выполнении функции произошли ошибки.

    Для того, чтобы получить строку по ее идентификатору, необходимо воспользоваться функцией DdeQueryString:

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

    • idInst - программный идентификатор приложения, полученный при регистрации в библиотеке DDEML;
    • hsz - идентификатор строки, которую нужно получить.
    • psz - указательна буфер, в который будет записана строка
    • cchMax - максимальная длина строки в символах. Вид символа определяется следующим по порядку параметром и может быть ANSI (1 байт) или Unicode (2 байта)
    • iCodePage - определяет тип символов строки. Возможные значения CP_WINANSI - для символов стандарта ANSI (1 байт) и CP_WINUNICODE - для символов стандарта Unicode (2 байта).

    Функция возвращает количество скопированных символов. При этом если фактическая длина строки (в символах) меньше указанной в параметре cchMax, то функция скопирует cchMax символов и вернет это значение. Если cchMax больше фактической длины строки, то функция скопирует всю строку и вернет количество скопированных символов. Если передать через параметр psz нулевое значение, то функция проигнорирует значение параметра cchMax и вернет фактическую длину строки в символах. Размер буфера в байтах для строки зависит от размера символа и определяется параметром iCodePage.

    Для получения данных из глобальной области памяти по их идентификатору нужно воспользоваться функцией DdeGetData:

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

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

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

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

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

    • idInst - программный идентификатор приложения, полученный при регистрации в библиотеке DDEML;
    • hszService - идентификатор строки названия сервиса, который необходимо предварительно получить вызовом функции DdeCreateStringHandle
    • hszTopic - идентификатор строки названия раздела, который также заранее запрашивается у библиотеки DDEML вызовом функции DdeCreateStringHandle;
    • pCC - указатель на специальную структуру типа CONVCONTEXT, в которой указывается информация о национальном языке и кодовой странице. В большинстве случаев (в нашем тоже) достаточно указать нулевое значение, что означает использование кодовой страницы ANSI.

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

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

    DdeDisconnect:

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

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

    • wType - Код транзакции. Коды транзакций предопределены протоколом DDE. Значения и названия соответствующих им констант можно посмотреть в технической документации. Забегая вперед, отмечу, что в нашем примере будут использоваться транзакции XTYP_ADVSTART для запуска потока данных по каналу, XTYP_ADVSTOP - для остановки потока данных, XTYP_ADVDATA - транзакция с уведомлением наличии данных от сервера.
    • wFmt - формат данных (в нашем случае данные представляют собой текстовую строку, поэтому этому параметру при вызове будет присвоено значение CF_TEXT, равное единице).
    • hConv - идентификатор канала. Этот идентификатор получен при создании канала.
    • hsz1 - идентификатор строки названия раздела.
    • hsz2 - идентификатор строки названия элемента данных.
    • hData - идентификатор глобальной области в памяти, где находятся данные от сервера. Данные необходимо получить с помощью функции DdeGetData.

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

    • pData - ссылка на данные, передаваемые транзакцией.
    • cbData - размер передаваемых данных
    • hConv - идентификатор канала связи, полученный заранее функцией DdeConnect
    • hszItem - идентификатор элемента данных, в нашем случае - ячейки. Идентификатор должен быть получен заранее, с помощью функции DdeCreateStringHandle.
    • uFmt - формат данных. Для случая с Excel указывается константа CF_TEXT(1)
    • uType - код транзакции. Определяется комбинацией битовых флагов. В случае организации горячего канала выполняется транзакция XTYP_ADVSTART - для начала цикла получения данных из ячейки (подписки на ячейку) и XTYP_ADVSTOP - для прекращения цикла получения данных из ячейки (отписки от ячейки).
    • dwTimeout - тайм-аут для синхронных транзакций - максимальное время выполнения синхронной транзакции. Если в качестве параметра передать 0, то будет запущена асинхронная транзакция. При запуске синхронной транзакции, приложение ждет ее завершения. При этом максимальное время выполнения транзакции определяется значением параметра. При запуске асинхронной транзакции приложение не ждет завершения транзакции и продолжает свою работу. По завершению транзакции клиент получит транзакцию XTYP_XACT_COMPLETE.
    • pdwResult - ссылка на двойное слово, в которое будет записан код завершения транзакции. Изначально эта переменная должна быть приравнена к нулю. (По рекомендации Microsoft, не рекомендуется использовать этот параметр, так как, возможно, в дальнейшем он поддерживаться не будет).

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

    Для функции обратного вызова необходимо создать делегат, который имеет соответствующую сигнатуру, и указать его в качестве параметра в функции DdeInitialize:

    Забегая вперед, отмечу, что для отображения необходимых функций и констант библиотеки DDEML в компоненте ExcelDDEHotConnection служит класс DDEML.

    Ниже приведен список остальных функций для работы с DDE:

    Делегат функции обратного вызова:

    Отображение функции DdeInitialize:

    Отображение функции DdeUninitialize:

    Отображение функции DdeCreateStringHandle:

    Отображение функции DdeFreeStringHandle:

    Отображение функции DdeConnect:

    Отображение функции DdeDisconnect:

    Отображение функции DdeClientTransaction:

    Отображение функции DdeGetData:

    Отображение функции DdeQueryString:

    4. Организация горячего канала Excel - приложение DDE.

    В этой главе вкратце описано, как осуществить корректное подключение и отключение от ячеек Excel. Например, необходимо получить доступ к ячейке, расположенной во втором столбце и первой строке на странице с названием <Лист1> рабочей книги <Книга1>. Для начала необходимо зарегистрироваться в библиотеке DDEML и получить программный идентификатор idInst:

    После этого создаем канал связи с нужным разделом. В нашем случае, как было упомянуто выше, название сервиса: <EXCEL>, а название раздела <[Книга1.xls]Лист1>. Необходимо помнить, что расширение файла необходимо указывать, если эта книга открыта из файла. Если осуществляется подключение к созданной, но еще не сохраненной книге, то расширение не указывается.

    После создания канала информируем Excel о том, чтобы приложение получало содержимое нужной ячейки, как только оно изменится (<горячий канал>). Для этого посылаем Excel транзакцию XTYP_ADVSTART:

    Отключение производим в обратном порядке, сначала информируем сервер о том, что данные из ячейки нам больше не нужны, посылая Excel транзакцию XTYP_ADVSTOP:

    После завершения транзакции, закрываем канал:

    И завершаем работу с библиотекой DDEML:

    5. Компонент ExcelDDEConnection.

    Ниже приведены основные методы и свойства класса ExcelDDEHotConnection:

    НазваниеОписание
    ExcelDDEHotConnection()Конструктор. Осуществляет регистрацию в библиотеке DDEML
    TopicDescriptorCollection TopicsСвойство. Ссылка на коллекцию разделов. Раздел адресуется названием книги и названием страницы
    void Dispose()Завершить работу объекта. Закрывает все каналы и производит отключение от библиотеки DDEML
    event AdviseDelegate DataСобытие. Происходит при изменении содержимого любой из подписанных ячеек. Событие вызывается для каждой изменившейся ячейки.

    Коллекция разделов TopicDescriptorCollection.

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

    Дескриптор раздела TopicDescriptor.

    Экземпляр класса описывает раздел данных. Каждый раздел содержит в себе коллекцию элементов данных типа ItemDescriptor, описывающих ячейки. При добавлении ячейки происходит отправка Excel транзакции на подписку на эту ячейку, при удалении - транзакция на завершение работы с ячейкой.

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

    В статье предполагается, что читатель может знать очень мало о предмете. Цель статьи - научить его использовать концепцию DDE при создании приложений в среде Delphi.
    Основы DDE

    DDE дает возможность перейти через рамки приложения и взаимодействовать с другими приложениями и системами Windows.

    Dynamic Data Exchange получило свое имя потому, что позволяет двум приложениям обмениваться данными (текстовыми, через глобальную память) динамически во время выполнения. Связь между двумя программами можно установить таким образом, что изменения в одном приложении будут отражаться во втором. Например, если Вы меняете число в электронной таблице, то во втором приложении данные обновятся автоматически и отобразят изменения. Кроме того, с помощью DDE можно из своего приложения управлять другими приложениями такими, как Word for Windows, Report Smith, Excel и др.

    Надеюсь, что данное краткое вступление поможет понять что предмет обсуждения представляет интерес. Далее рассказывается, как использовать компоненты Delphi для построения DDE приложений.
    Использование DDE

    Приложение, получающее данные из другого приложения по DDE и/или управляющее другим приложением с помощью команд через DDE является DDE-клиентом. В этом случае второе приложение является DDE-сервером. Одно и то-же приложение может быть одновременно и сервером, и клиентом (например, MicroSoft Word). Построение DDE-серверов и DDE-клиентов удобно рассмотреть на примере, поставляемом с Delphi (каталог x:\delphi\demos\ddedemo). Сперва давайте рассмотрим логику работы примера. Для начала нужно откомпилировать проекты DDESRVR.DPR и DDECLI.DPR, после этого запустите программу DDECLI.EXE (DDE-клиент) и выберите пункт меню File|New Link. При этом должна запуститься программа DDESRVR (DDE-сервер). Если теперь редактировать текст в окне сервера, то изменения мгновенно отразятся в приложении-клиенте (см. рис.1, рис.2)

    Рис.1: Приложение - DDE-сервер. Здесь идет редактирование текста.

    Рис.2: Приложение - DDE-клиент. Здесь отображаются изменения.

    Пример демонстрирует и другие возможности DDE: - пересылка данных из клиента на сервер (Poke Data); наберите любой текст в правом окне DDE-клиента и нажмите кнопку Poke Data, этот текст появится в окне сервера. - исполнение команд (макросов) на сервере; наберите любой текст в правом окне DDE-клиента и нажмите кнопку Exec Macro, DDE-сервер выдаст соответствующее диалоговое окно. - установление связи через Clipboard; закройте оба DDE-приложения и запустите их заново, затем в DDE-сервере выберите пункт меню Edit|Copy, далее в клиенте выберите пункт меню Edit|Paste Link.

    Теперь давайте рассмотрим эти демонстрационные программы с технической точки зрения и узнаем, каким образом в Delphi можно создать DDE-приложения. Начнем с DDE-сервера.
    DDE-серверы

    На рис.3 представлен пример DDE-сервера во время дизайна в среде Delphi.

    Рис.3: DDE-сервер в среде Delphi.

    Для построении DDE-сервера в Delphi имеются два объекта, расположенные на странице System Палитры Компонент - TDdeServerConv и TDdeServerItem. Обычно в проекте используется один объект TDdeServerConv и один или более TDdeServerItem. Для получения доступа к сервису DDE-сервера, клиенту потребуется знать несколько параметров : имя сервиса (Service Name) - это имя приложения (обычно - имя выполняемого файла без расширения EXE, возможно с полным путем); Topic Name - в Delphi это имя компоненты TDdeServerConv; Item Name - в Delphi это имя нужной компоненты TDdeServerItem.

    Назначение объекта TDdeServerConv - общее управление DDE и обработка запросов от клиентов на выполнение макроса. Последнее выполняется в обработчике события OnExecuteMacro, например, как это сделано в нашем случае:

    Объект TDdeServerItem связывается с TDdeServerConv и определяет, что, собственно, будет пересылаться по DDE. Для этого у него есть свойства Text и Lines. (Text имеет то же значение, что и Lines[0].) При изменении значения этих свойств автоматически происходит пересылка обновленных данных во все приложения-клиенты, установившие связь с сервером. В нашем приложении изменение значения свойства Lines происходит в обработчике события OnChange компонента Edit1:

    Этот же компонент отвечает за получение данных от клиента, в нашем примере это происходило при нажатии кнопки Poke Data, это выполняется в обработчике события OnPokeData:

    И последнее - установление связи через Clipboard. Для этого служит метод CopyToClipboard объекта TDdeServerItem. Необходимая информации помещается в Clipboard и может быть вызвана из приложения-клиента при установлении связи. Обычно, в DDE-серверах для этого есть специальный пункт меню Paste Special или Paste Link.

    Итак, мы рассмотрели пример полнофункционального DDE-сервера, построенного с помощью компонент Delphi. Очень часто существующие DDE-серверы не полностью реализуют возможности DDE и предоставляют только часть сервиса. Например, ReportSmith позволяет по DDE только выполнять команды (макросы).
    DDE-клиенты

    На рис.4 представлен пример DDE-клиента во время дизайна в среде Delphi.

    Рис.4: DDE-клиент в среде Delphi.

    Для построения DDE-клиента в Delphi используются два компонента TDDEClientConv и TDDEClientItem. Аналогично серверу, в программе обычно используется один объект TDDEClientConv и один и более связанных с ним TDDEClientItem.

    TDDEClientConv служит для установления связи с сервером и общим управлением DDE-связью. Установить связь с DDE-сервером можно как во время дизайна, так и во время выполнения программы, причем двумя способами. Первый способ - заполнить вручную необходимые свойства компонента. Это DdeService, DdeTopic и ServiceApplication. Во время дизайна щелкните дважды на одно из первых двух свойств в Инспекторе Объектов - Вы получите диалог для определения DDE-связи (см. рис.5).

    Рис.5: Диалог для установления связи с DDE-сервером (Report Smith).

    Укажите в диалоге имена DDE Service и DDE Topic. Эти имена можно узнать из документации по тому DDE-серверу, с которым Вы работаете. В случае DDE-сервера, созданного на Delphi, это имя программы (без .EXE) и имя объекта TDdeServerConv. Для установления связи через Clipboard в диалоге есть специальная кнопка Past Link. Ей можно воспользоваться, если Вы запустили DDE-сервер, сохранили каким-то образом информацию о связи и вошли в этот диалог. Например, если DDE-сервером является DataBase Desktop, то нужно загрузить в него какую-нибудь таблицу Paradox, выбрать любое поле и выбрать пункт меню Edit|Copy. После этого войдите в диалог и нажмите кнопку Paste Link. Поля в диалоге заполнятся соответствующим образом.

    Свойство ServiceApplication заполняется в том случае, если в поле DDEService содержится имя, отличное от имени программы, либо если эта программа не находится в текущей директории. В этом поле указывается полный путь и имя программы без расширения (.EXE). При работе с Report Smith здесь нужно указать, например : C:\RPTSMITH\RPTSMITH

    Данная информация нужна для автоматического запуска сервера при установлении связи по DDE, если тот еще не был запущен.

    В нашей демо-программе связь устанавливается во время выполнения программы в пунктах меню File|New Link и Edit|Paste Link. В пункте меню File|New Link программно устанавливается связь по DDE с помощью соответствующего метода объекта TDdeServerConv, OpenLink делать не надо, поскольку свойство ConnectMode имеет значение ddeAutomatic:

    Здесь же заполняются свойства объекта TDdeClietItem.

    В пункте меню Edit|Past Link программно устанавливается связь по DDE с использованием информации из Clipboard:

    После того, как установлена связь, нужно позаботиться о поступающих по DDE данных, это делается в обработчике события OnChange объекта TDdeClietItem:

    Это единственная задача объекта TDdeClientItem.

    На объект TDdeClientConv возлагаются еще две задачи : пересылка данных на сервер и выполнение макросов. Для этого у данного объекта есть соответствующие методы. Посмотрим, как это можно было бы сделать. Выполнение макроса на сервере:

    Пересылка данных на сервер: Управление ReportSmith по DDE

    В прилагаемом примере run-time версия ReportSmith выполняет команду, переданную по DDE. Имена DDE сервиса для ReportSmith и некоторых других приложений можно узнать в Справочнике в среде ReportSmith.

    Перед запуском примера нужно правильно установить в свойстве ServiceApplication путь к run-time версии ReportSmith и в тексте программы в строке

    Читайте также: