Here's the translation of the content into Russian:
Классический пример использования сообщения WM_ COPYDATA для передачи строки между двумя приложениями!
Вот разбивка того, что происходит:
Получатель (TFormReceive)
Процедура ReceiveMessage отвечает за получение скопированной данных. Она использует сообщение WM_ COPYDATA для получения данных. Поле LParam структуры TMessage содержит указатель на запись TCopyDataStruct, которая хранит данные, отправляемые.
В этом случае свойство Caption формы обновляется полученной строкой, кастомизируя поле lpData записи TCopyDataStruct в указатель на null-terminated строку (PChar).
Отправитель (TFormXXX)
Процедура Button1Click отправляет данные с помощью функции SendMessage. Она создает запись TCopyDataStruct, устанавливая ее поля:
cbData: Длина строки плюс 1 (чтобы учесть terminator null).
lpData: Указатель на строку, отправляемую.
Функция SendMessage затем используется для отправки сообщения WM_ COPYDATA получателю. Параметр LParam содержит указатель на запись TCopyDataStruct, которая передается в процедуру ReceiveMessage.
Чтобы обеспечить корректную передачу данных, убедитесь, что оба приложения запущены и что форма получателя имеет фокус при отправке данных.
Альтернативное решение
Если вы работаете с Delphi 2009 или позднее, можно использовать класс TStream для отправки двоичных данных между приложениями. Этоapproach более гибкий и эффективный, чем использование WM_ COPYDATA. Вы можете создать поток, записать свои данные в него и затем отправить его как сообщение.
Например:
procedure TFormXXX.Button1Click(Sender: TObject);
var
Stream: TStream;
begin
Stream := TMemoryStream.Create;
Stream.Write(Edit1.Text, Length(Edit1.Text));
SendMessage(FindWindow('TFormReceive', nil), WM_COPYDATA, 0, LPARAM(@Stream));
end;
procedure TFormReceive.ReceiveMessage(var Msg: TMessage);
var
Stream: TStream;
begin
Stream := TMemoryStream.Create;
Stream.CopyFrom(Msg.LParam, SizeOf(TMemoryStream));
Caption := Stream.ReadString(Stream.Size - 1, TEncoding.Default);
FreeAndNil(Stream);
end;
В этом примере создается поток TMemoryStream, чтобы хранить данные. Данные записываются в поток с помощью метода Write, а затем отправляются как сообщение с помощью функции SendMessage. В процедуре ReceiveMessage получателя поток читается обратно в память с помощью метода CopyFrom, а строка извлекается из него с помощью метода ReadString.
Этот подход обеспечивает более контролируемую передачу данных, но может требовать дополнительной обработки ошибок в зависимости от вашего конкретного требования.
Статья описывает способ передачи строки между приложениями с помощью интерфейса сообщений Windows и структуры CopyDataStruct.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.