DDE - давній і прижився протокол обміну даними між різними додатками, що з'явився ще на зорі ери Windows. З тих пір на його базі був створений інтерфейс OLE, а в 32-розрядному API Windows з'явилися й інші методи міжпрограмного взаємодії. Але ніша, яку займає DDE, залишилася незмінною - це оперативна передача та синхронізація даних в додатках. Програми, що використовують DDE, поділяються на дві категорії - клієнти і сервери. Обидва учасники процесу здійснюють контакти (conversations) з певних тем (topic), при цьому в рамках теми проводиться обмін елементами даних (items). Встановлює контакт клієнт, який надсилає запит, що містить імена контакту і теми. Після встановлення контакту всяка зміна елемента даних на сервері передається даними клієнта. Розробники підсистеми DDE в Delphi, вірні ідеології створення VCL, звели інтерфейс цього протоколу до чотирьох компонентів - двом для сервера і двом для клієнта. На рівні підтримки контакту лежать компоненти TDDEServerConv і TDDEClientConv. Перший грає пасивну роль - він тільки вказує ім'я однієї з підтримуваних сервером тем. Всі операції по встановленню і розриву контакту здійснює з програми-клієнта другий компонент. За допомогою одного контакту можуть бути пов'язані і синхронізовані кілька пар елементів даних. Для їх опису призначені компоненти TDDEServerItem і TDDEClientItem. Кожен з них під час роботи повинен вказувати на контакт, до якого він прив'язаний. Крім того, у складі обох є властивості, що містять якийсь текст. При встановленому контакті їх вміст синхронізується. Крім цього в модулі DDEMAN описаний і п'ятий компонент, який управляє всіма зв'язками DDE. Його розгляд виходить за рамки книги.
71. Особливості проекту DDE Dialog. Надсилання даних серверові.
DDE дає можливість перейти через рамки програми і взаємодіяти з іншими програмами та системами Windows.
Dynamic Data Exchange отримало своє ім'я тому, що дозволяє двом додаткам обмінюватися даними (текстовими, через глобальну пам'ять) динамічно під час виконання. Зв'язок між двома програмами можна встановити таким чином, що зміни в одному додатку будуть відображатися в другому. Наприклад, якщо Ви змінюєте число в електронній таблиці, то в другому додатку дані оновляться автоматично і відобразять зміни. Крім того, за допомогою DDE можна з свого застосування керувати іншими додатками такими, як Word for Windows, Report Smith, Excel та ін
Додаток, яка отримує дані з іншої програми по DDE і / або управляє іншим додатком з допомогою команд через DDE є DDE-клієнтом. У цьому випадку другий додаток є DDE-сервером. Одне і те-ж додаток може бути одночасно і сервером, і клієнтом (наприклад, MicroSoft Word).
Для побудові DDE-сервера в Delphi є об'єкта, розташовані на сторінці System Палітри Компонент - TDdeServerConv і TDdeServerItem. Зазвичай у проекті використовується один об'єкт TDdeServerConv і один або більше TDdeServerItem.
Для побудови DDE-клієнта в Delphi використовуються два компоненти TDDEClientConv і TDDEClientItem. Аналогічно серверу, в програмі зазвичай використовується один об'єкт TDDEClientConv і один і більше пов'язаних з ним TDDEClientItem.
72. Взаємодія з сервером (WinWord) як з com-об’єктом (Variant, CreateOleObject,…).
Для створення сервера автоматизації використовується функція CreateOleObject, описана в модулі Comobj наступним чином: function CreateOleObject (const ClassName: string): IDispatch; Функція видає посилання на інтерфейс IDispatch об'єкта, зареєстрованого в реєстрі Windows під ім'ям ClassName. Для визначення назви класу слід вивчити документацію до програмного продукту, що надає сервер автоматизації. Для програми Microsoft Word таким ім'ям є «Word.Application», а для Microsoft Excel - «Excel.Application». Аналогічні назви класів мають і інші компоненти Microsoft Office. Якщо сервер автоматизації вже запущений, то посилання на нього можна отримати за допомогою функції GetActiveOleObject: function GetActiveOleObject (const ClassName: string): IDispatch; Якщо при виклику методу GetActiveOleObject система не може виявити запущену версію заданого сервера автоматизації, то буде порушена виняткова ситуація класу EOleError. Посилання, які повертають функції GreateOleObject і GetActiveOleObject, слід зберігати в змінних для подальшого доступу до створеного або отриманого об'єкта. Незважаючи на те, що тип посилання визначений як IDispatch, змінна, в яку це посилання зберігається, повинна мати тип Variant. Це пов'язано з тим, що з даної змінної будуть викликатися методи сервера автоматизації, які не описані в інтерфейсі IDispatch. Var Object: Variant; Object: = CreateOleObject ('Word.Application'); Використання екземпляра сервера автоматизації, тобто виклик його методів, здійснюється з допомогою конструкцій, звичайних для виклику методів у Delphi: <Посилання на сервер>. <Назва методу> (<Список параметрів>); Однак механізм, який використовується для реального виклику, істотно відрізняється від виклику методів Delphi-класів. Назва методу і список його параметрів запаковуються у спеціальну структуру, яка потім передається методу invoke СОМ-об'єкту через посилання, отримане при виконанні функції CreateOleObject. Метод invoke визначає, який саме його метод повинен бути викликаний, виконує його, запаковує результат і повертає його в викликала програму. Об'єкти автоматизації підтримують також і доступ до властивостей через спеціальним чином описані методи. Для руйнування структур даних, пов'язаних з використанням СОМ-об'єкт в програмі, слід присвоїти посиланням на нього значення Unassigned. Дана операція не закриває запущений сервер автоматизації:Var Object: Variant; Object: = CreateOleObject ('Word.Application'); Використання екземпляра сервера автоматизації, здійснюється з допомогою конструкцій, звичайних для виклику методів у Delphi: <Посилання на сервер>. <Назва методу> (<Список параметрів>); Назва методу і список його параметрів запаковуються у спеціальну структуру, яка потім передається методу invoke СОМ-об'єкту через посилання, отримане при виконанні функції CreateOleObject.