Передать строки, картинки (streams) между процессами
{
The WM_COPYDATA messages makes it possible to transfer information
between processes. It does this by passing the data through the kernel.
Space is allocated in the receiving process to hold the information that is copied,
by the kernel, from the source process to the target process.
The sender passes a pointer to a COPYDATASTRUCT, which is defined as a structure
of the following:
}type
TCopyDataStruct = packedrecord
dwData: DWORD; // anwendungsspezifischer Wert
cbData: DWORD; // Byte-Lдnge der zu ьbertragenden Daten
lpData: Pointer; // Adresse der Daten end;
{ Sender Application }unit SenderApp;
interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
privateprocedure SendCopyData(hTargetWnd: HWND; ACopyDataStruct:TCopyDataStruct);
publicend;
var
Form1: TForm1;
implementation{$R *.DFM}// Sender: Send data procedure TForm1.SendCopyData(hTargetWnd: HWND; ACopyDataStruct:TCopyDataStruct);
beginif hTargetWnd <> 0 then
SendMessage(hTargetWnd, WM_COPYDATA, Longint(Handle), Longint(@ACopyDataStruct))
else
ShowMessage('No Recipient found!');
end;
// Send Text from Edit1 to other app procedure TForm1.Button1Click(Sender: TObject);
var
MyCopyDataStruct: TCopyDataStruct;
hTargetWnd: HWND;
begin// Set up a COPYDATASTRUCT structure for use with WM_COPYDATA // TCopyDataStruct mit den Sende-Daten Infos ausfьllen with MyCopyDataStruct dobegin
dwData := 0; // may use a value do identify content of message
cbData := StrLen(PChar(Edit1.Text)) + 1; //Need to transfer terminating #0 as well
lpData := PChar(Edit1.Text)
end;
// Find the destination window for the WM_COPYDATA message // Empfдnger Fenster anhand des Titelzeilentextes suchen
hTargetWnd := FindWindow(nil,PChar('Message Receiver'));
// send the structure to the receiver // Die Struktur an den Empfдnger schicken
SendCopyData(hTargetWnd, MyCopyDataStruct);
end;
// Send Image1 to other app procedure TForm1.Button2Click(Sender: TObject);
var
ms: TMemoryStream;
MyCopyDataStruct: TCopyDataStruct;
hTargetWnd: HWND;
begin
ms := TMemoryStream.Create;
try
image1.Picture.Bitmap.SaveToStream(ms);
with MyCopyDataStruct dobegin
dwData := 1;
cbData := ms.Size;
lpData := ms.Memory;
end;
// Search window by the window title // Empfдnger Fenster anhand des Titelzeilentextes suchen
hTargetWnd := FindWindow(nil,PChar('Message Receiver'));
// Send the Data // Daten Senden
SendCopyData(hTargetWnd,MyCopyDataStruct);
finally
ms.Free;
end;
end;
end.
{*********************************************************************}{ Receiver Application }unit ReceiverApp;
interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
Label1: TLabel;
privateprocedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
{ Private-Deklarationen }public{ Public-Deklarationen }end;
var
Form1: TForm1;
implementation{$R *.DFM}procedure TForm1.WMCopyData(var Msg: TWMCopyData);
var
sText: array[0..99] of Char;
ms: TMemoryStream;
begincase Msg.CopyDataStruct.dwData of
0: { Receive Text, Text empfangen}begin
StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);
label1.Caption := sText;
end;
1: { Receive Image, Bild empfangen}begin
ms := TMemoryStream.Create;
trywith Msg.CopyDataStruct^ do
ms.Write(lpdata^, cbdata);
ms.Position := 0;
image1.Picture.Bitmap.LoadFromStream(ms);
finally
ms.Free;
end;
end;
end;
end;
end.
Пример программирования на Delphi, демонстрирующий отправку данных между двумя процессами с помощью сообщения WM_COPYDATA.
Код состоит из двух приложений: SenderApp и ReceiverApp.
SenderApp
В этом приложении есть два кнопки: Button1 и Button2. При клике на Button1, он отправляет текстовую строку из редактора (Edit1) в процесс-приемник с помощью WM_COPYDATA. При клике на Button2, он отправляет растровое изображение, хранящееся в компоненте TImage (Image1), в процесс-приемник.
Процедура SendCopyData используется для отправки структуры данных (TCopyDataStruct) в процесс-приемник. Структура данных содержит информацию о типе данных, его длине и указатель на фактические данные.
ReceiverApp
В этом приложении есть одна кнопка: Button1. При клике на нее, он получает данные из процесса-отправителя с помощью WM_COPYDATA и обрабатывает их соответствующим образом.
Процедура WMCopyData используется для получения структуры данных (TCopyDataStruct) из процесса-отправителя. Структура данных содержит информацию о типе данных, его длине и указатель на фактические данные. В зависимости от этой информации процесс-приемник решает, как обрабатывать полученные данные.
Код демонстрирует пример отправки текстовых и растровых изображений между процессами с помощью WM_COPYDATA. Однако важно отметить, что отправка больших объемов данных или сложных структур данных может быть неэффективной или unreliable из-за ограничений в реализации Windows WM_COPYDATA.
Вот некоторые предложения по улучшению кода:
Используйте обработку ошибок для обеспечения корректного приема и обработки данных процессом-приемником.
Рассмотрите использование более надежной методики отправки данных между процессами, например, с помощью сокетов или трубопроводов.
Если вам нужно отправлять большие объемы данных, рассмотрите использование более эффективной методики, например, с помощью памяти-отображаемых файлов или потоковой передачи данных.
В целом, код демонстрирует основные принципы использования WM_COPYDATA для межпроцессного взаимодействия в Delphi. Однако важно тщательно оценить ограничения и потенциальные проблемы перед использованием этого подхода в производственной среде.
Передача строк и картинок между процессами в Delphi с помощью WM_COPYDATA сообщения.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.