Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Передать строки, картинки (streams) между процессами

Delphi , Программа и Интерфейс , Процессы и Сервисы

Передать строки, картинки (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 = packed record 
    dwData: DWORD;   // anwendungsspezifischer Wert 
    cbData: DWORD;   // Byte-Lдnge der zu ьbertragenden Daten 
    lpData: Pointer; // Adresse der Daten 
  end; 
 

{ Sender Application } 

unit SenderApp; 

interface 

uses 
  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); 
  private 
    procedure SendCopyData(hTargetWnd: HWND; ACopyDataStruct:TCopyDataStruct); 
  public 
  end; 

var 
  Form1: TForm1; 

implementation 

{$R *.DFM} 

// Sender: Send data 
procedure TForm1.SendCopyData(hTargetWnd: HWND; ACopyDataStruct:TCopyDataStruct); 
begin 
  if 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 do 
  begin 
    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 do 
    begin 
      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; 

interface 

uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
  ExtCtrls, StdCtrls; 

type 
  TForm1 = class(TForm) 
    Image1: TImage; 
    Label1: TLabel; 
  private 
    procedure 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; 
begin 
  case 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; 
        try 
          with 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Процессы и Сервисы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 12:02:39/0.0056159496307373/1