- •Кафедра кит контрольная работа по дисциплине "Системное программирование"
- •Краматорск 2011 Задание №1
- •Задание №2
- •Задание №3
- •Решение
- •Задание №4 Обмен данными между приложениями с использованием технологии динамического обмена данными с помощью сокетов
- •Решение
- •Задание № 5 Обмен данными между приложениями с использованием технологии динамического обмена данными с помощью именованных каналов
- •Задание №6 Использование технологии сом при разработке приложений в Delphi. Создание и использование внутреннего сервера
Задание №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 следит за обеспечением совместимости со всеми её предыдущими версиями. Возможно использование для извлечения данных из сторонних приложений.