Читаем Delphi. Трюки и эффекты полностью

Сообщение WMCOPYDATA позволяет приложениям копировать данные между их адресными пространствами. Для передачи сообщения должна использоваться функция синхронной отправки сообщения SendMessage, а не PostMessage, которая асинхронным образом передает сообщение. Данные, предназначенные для передачи, не должны содержать указателей или других ссылок на объекты, недоступные для программы, принимающей эти данные. Рассмотрим параметры, передаваемые с сообщением WM_COPYDATA:

...

//дескриптор передающего окна

wParam = (WPARAM) (HWND) hwnd;

//указатель на структуру с данными

lParam = (LPARAM) (PCOPYDATASTRUCT) pcds;

На использование сообщения налагаются следующие ограничения:

• данные, которые будут приняты, должны быть только для чтения, так как изменение структуры с данными может привести к непредсказуемым последствиям;

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

Итак, приступим к созданию приложения, демонстрирующего работу WM_COPYDATA Для создания хорошего примера потребуется создать два приложения. Первое будет отправлять данные (например, строку текста), другое приложение будет их получать. На главной форме первого приложения помещаем элемент управления TextBox, в который будет записываться передаваемая строка, и кнопку, нажатие которой инициирует передачу данных. Для второго приложения достаточно элемента для отображения текстовой информации типа Label. Перейдем к рассмотрению исходных текстов созданных приложений.

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

...

const

CMD_SETLABELTEXT = 1; // Задаем ID команды

На форме находится кнопка отправки данных другому приложению, ее обработчик выглядит следующим образом (листинг 8.1).

...

Листинг 8.1.

Отправка данных другому приложению

procedure TDataSender.bnSendClick(Sender: TObject);

var

CDS: TCopyDataStruct;

begin

//Устанавливаем тип команды

CDS.dwData := CMD_SETLABELTEXT;

//Устанавливаем длину передаваемых данных

CDS.cbData := Length(StringEdit.Text) + 1;

//Выделяем память буфера для передачи данных

GetMem(CDS.lpData, CDS.cbData);

try

//Копируем данные в буфер

StrPCopy(CDS.lpData, StringEdit.Text);

// Отсылаем сообщение в окно с заголовком StringReciever

SendMessage(FindWindow(NIL, \'StringReciever\'),

WM_COPYDATA, Handle, Integer(@CDS));

Finally

//Высвобождаем буфер

FreeMem(CDS.lpData, CDS.cbData);

end;

end;

Подробного комментария данный листинг не требует. Обратите лишь внимание на вызов функции SendMessage, которая использует FindWindow для задания одного из своих параметров. Процедура FindWindow в случае успешного выполнения возвращает HWND окна, заголовок которого задается в параметре этой функции (строка StringReciever из предыдущего примера). Синхронная отправка сообщения WM_COPYDATA с набором данных, которые помещены в структуру CDS, осуществляется вызовом SendMessage.

Рассмотрим второе приложение, которое принимает строку и отображает ее в надписи ( Label). Для начала в блок объявления помещаем обработчик сообщения и объявляем само сообщение WM_COPYDATA:

...

type

TStringReciever = class(TForm)

LabelStr: TLabel;

private

//Обработчик сообщения WM_COPYDATA

procedure WMCopyData(var MessageData: TWMCopyData);

message WM_COPYDATA;

Как и в случае первого приложения, нам необходима константа, которая будет идентифицировать тип операции:

...

const

CMD_SETLABELTEXT = 1;

Далее рассмотрим тело функции обработчика сообщения WM_COPYDATA (листинг 8.2).

...

Перейти на страницу:

Похожие книги

1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

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

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT
Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ
Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ

Эта книга представляет собой перевод третьего издания американского бестселлера Effective C++ и является руководством по грамотному использованию языка C++. Она поможет сделать ваши программы более понятными, простыми в сопровождении и эффективными. Помимо материала, описывающего общую стратегию проектирования, книга включает в себя главы по программированию с применением шаблонов и по управлению ресурсами, а также множество советов, которые позволят усовершенствовать ваши программы и сделать работу более интересной и творческой. Книга также включает новый материал по принципам обработки исключений, паттернам проектирования и библиотечным средствам.Издание ориентировано на программистов, знакомых с основами C++ и имеющих навыки его практического применения.

Скотт Мейерс , Скотт Майерс

Программирование, программы, базы данных / Программирование / Книги по IT