Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
сис прог печать.doc
Скачиваний:
27
Добавлен:
11.12.2018
Размер:
329.22 Кб
Скачать

Задание №2

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

Индивидуальное задание: Согласно своему индивидуальному заданию реализовать обмен данными о результатах вызова функций Windows API между двумя приложениями использую компоненты Delphi

Решение

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

Класс TDdeServerConv предназначен для реализации сервера приложения DDE. В этом классе реализуется свойство Name в котором указывается имя сервера.(Клиент использует это имя для подключения). Так же в этом классе есть функция ExecuteMacro() которая вызывается при вызове на стороне клиента функции ExecuteMacro.В обработчике события ExecuteMacro() происходит обработка макровызова клиента.

Класс TDdeServerItem предназначен для создание темы в которой непосредственно будут храниться данные для передачи клиенту. На стороне клиента они будут вызываться с помощью функции RequestData();

Класс TDdeClientConv клиентский класс которых реализует функции приема данных о результате запуска удаленных функций на стороне сервера.

Класс TDdeClientItem непосредственно содержит данные о результе выполнения функций.

В клиентском приложении создается один сервер(Topic1) и две темы через которые производится обмен данными. Для функции GetCurrentDirectory() используется тема Item1, а для функции SystemTimeToFileTime () используется тема Item2.

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

В серверной части приложения используется обработчик тем DdeClientItem1Change().В нем происходит вызов функций и возврат результата в поле Item компонента TDdeServerItem что приводит к обновлению данных в клиентской части.

Код сервера:

void __fastcall TForm13::Item1PokeData(TObject *Sender)

{

Item1->Lines->Clear();

char temp_data[80];

GetCurrentDirectory(80,temp_data);

Item1->Text = temp_data;

Memo1->Text = Item1->Text;

}

//---------------------------------------------------------------------------

void __fastcall TForm13::Item2PokeData(TObject *Sender)

{

SYSTEMTIME Stime;

FILETIME Ftime;

time = (SYSTEMTIME)((TDdeServerItem *)Sender)->Lines->Strings[0];

Memo1->Lines->Add(time);

if(SystemTimeToFileTime((&Stime),&Ftime))Item1->Text = (PVOID)(&Ftime);

else Item1->Text = "Ложно";

Memo1->Text = Item1->Text;

Код клиента:

void __fastcall TForm15::DdeClientItem1Change(TObject *Sender)

{

Edit2->Text = DdeClientItem1->Text;

}

//---------------------------------------------------------------------------

void __fastcall TForm15::Button2Click(TObject *Sender)

{

SYSTEMTIME Stime;

if((!DdeClientConv1->SetLink("Server","Topic2"))||!DdeClientConv1->OpenLink())

ShowMessage("Нет контакта с сервером");

else

{

DdeClientItem2->DdeItem = "Item2";

Memo1->Clear();

Memo1->Lines->Add((char *)((PVOID)&Stime));

if(!DdeClientConv1->PokeDataLines(DdeClientItem2->DdeItem,Memo1->Lines))

ShowMessage("Данные не переданы");

DdeClientConv1->CloseLink();

}

}

//---------------------------------------------------------------------------

void __fastcall TForm15::Button1Click(TObject *Sender)

{

DdeClientItem1->DdeItem = "Item1";

if((!DdeClientConv1->SetLink("Server","Topic1"))||!DdeClientConv1->OpenLink())

{ShowMessage("Нет контакта с сервером");}

else

{

if(!DdeClientConv1->PokeData(DdeClientItem1->DdeItem,"GetCurrentDirectory()"))

ShowMessage("Данные не переданы");

DdeClientConv1->CloseLink();

}

}

//---------------------------------------------------------------------------

void __fastcall TForm15::DdeClientItem2Change(TObject *Sender)

{

Memo1->Clear();

Memo1->Lines->Add(DdeClientItem2->Text);

}

Результат:

Вывод: Данный механизм обмена данными в настоящее время уже устарел и не развивается, хотя поддерживается современными средствами, в основном он заменён на более мощные механизмы — OLE, COM и Microsoft OLE Automation. Однако, DDE по прежнему используется в некоторых местах внутри самой Windows, в частности, в механизме ассоциации расширения имени файла с приложениями. Это является следствием модели разработки, в которой Microsoft в новых версиях ОС Windows следит за обеспечением совместимости со всеми её предыдущими версиями. Возможно использование для извлечения данных из сторонних приложений.