Вот еще один пример обмена данными между приложениями 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.
|