Карта сайтаСсылкиКонтакты

Обмен данными между двумя приложениями Delphi

PDF Печать
Статьи

Вот еще один пример обмена данными между приложениями Delphi, но здесь используется специальное сообщение, чтобы предупредить другие приложения о новых данных:

Приложение, которое принимает данные


unit Trans;

 interface

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

 CONST
   WM_TRANSFER = WM_USER + 1;  // Определяем сообщение

 type
PCompartido =^TCompartido;
  TCompartido = record
Manejador1: Cardinal;
    Manejador2: Cardinal;
    Numero    : Integer;
    Cadena    : String[20];
  end;

(*  -------------------------------------- *)

 type
TForm1 = class(TForm)
     Edit1: TEdit;
     procedure FormCreate(Sender: TObject);
     procedure Edit1Change(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure Edit1KeyDown(Sender: TObject; var Key: Word;
       Shift: TShiftState);
   private
     Compartido : PCompartido;
     FicheroM   : THandle;
   public
     { Public declarations }
end;

var
Form1: TForm1;

 implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
 begin
Edit1.MaxLength:=20;
   { создаем память для файла }
FicheroM:=CreateFileMapping( $FFFFFFFF,nil,PAGE_READWRITE,0,
                               SizeOf(TCompartido),'MiFichero');
    { если создается файл, заполним его нулями }
if FicheroM=0 then
raise Exception.Create( 'Не удалось создать файл'+
                              '/Ошибка при создании файла');

Compartido:=MapViewOfFile(FicheroM,FILE_MAP_WRITE,0,0,0);

    { запись данных в файл памяти }
Compartido^.Manejador1:=Handle;
    Compartido^.Numero:=777;
    Compartido^.Cadena:=Edit1.text;
 end;

procedure TForm1.Edit1Change(Sender: TObject);
 begin
Compartido^.Cadena:=Edit1.Text;
 end;

procedure TForm1.FormDestroy(Sender: TObject);
 begin
{ закрываем файл }
UnmapViewOfFile(Compartido);
   { закрыли ссылку на него }
CloseHandle(FicheroM);
 end;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
   Shift: TShiftState);
 begin
if key = 13 then Begin
     if compartido^.Manejador2 <> 0 then
PostMessage(Compartido^.Manejador2, WM_TRANSFER,0, 0);
  end;
end;

end.

Приложение, которое читает данные


unit Recep;

 interface

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

 const
WM_TRANSFER = WM_USER + 1;

 type
PCompartido =^TCompartido;
  TCompartido = record
Manejador1: Cardinal;
    Manejador2: Cardinal;
    Numero    : Integer;
    Cadena    : String[20];
  end;

type
TForm1 = class(TForm)
     Label1: TLabel;
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
   private
     Compartido : PCompartido;
     FicheroM   : THandle;
     procedure Reciviendo(var Msg: TMessage); message WM_TRANSFER;

   public
     { Public declarations }
end;

var
Form1: TForm1;

 implementation

{$R *.DFM}

procedure Tform1.Reciviendo(var Msg: TMessage);
 begin
label1.Caption:=compartido^.Cadena;
 end;

procedure TForm1.FormCreate(Sender: TObject);
 begin
{ Посмотрим, существует ли файл }
FicheroM:=OpenFileMapping(FILE_MAP_READ,False,'MiFichero');
   { Если нет, то ошибка }
if FicheroM = 0 then
raise Exception.Create('Ошибка');
     Compartido:=MapViewOfFile(FicheroM,FILE_MAP_READ,0,0,0);
     compartido^.Manejador2:=Handle;
 end;

procedure TForm1.FormDestroy(Sender: TObject);
 begin
UnmapViewOfFile(Compartido);
   CloseHandle(FicheroM);
 end;

end.

 

Добавить комментарий


Защитный код
Обновить