Estimados:
Desarrollo 2 aplicaciones donde la aplicación 1 debe enviarle sierta información a la aplicación 2 a travez de la memoria. Esta información es un array de una estructura de datos (array of record).
Para ello utilizé el siguiente código:
Aplicación 1 (aplicación que envia datos)
Código Delphi
[-]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ShellApi;
type
TTest = packed record
Fecha,
Hora:TDateTime;
Monto,
CantCuotas:real;
MarcaOS:string[1];
NroTicket:int64;
CodBarras:int64;
CodTroquel:integer;
Alfabeta:integer;
CantSolicitada:integer;
TipoBonificacion:string[2];
ValorBonificacion:real;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
Test:array of TTest;
CopyDataStruct:TCopyDataStruct;
PAplicacion2:Thandle; Resultado:integer;
regs:integer;
begin
regs:=2;
SetLength(Test,regs);
with test[0] do
begin
Fecha:=now;
Hora:=now;
Monto:=110.20;
CantCuotas:=1.0;
MarcaOS:='1';
NroTicket:=999888999;
CodBarras:=7796930007303;
CodTroquel:=4108371;
Alfabeta:=0;
CantSolicitada:=2;
TipoBonificacion:='';
ValorBonificacion:=0;
end;
with test[1] do
begin
Fecha:=now;
Hora:=now;
Monto:=110.20;
CantCuotas:=1.0;
MarcaOS:='1';
NroTicket:=999888999;
CodBarras:=7792069002868;
CodTroquel:=3104331;
Alfabeta:=0;
CantSolicitada:=1;
TipoBonificacion:='';
ValorBonificacion:=0;
end;
CopyDataStruct.dwData := 2; CopyDataStruct.cbData := SizeOf(Test)*regs;
CopyDataStruct.lpData := @Test;
PAplicacion2:=findwindow('TAplication2',nil);
if PAplicacion2 = 0 then begin ShellExecute(handle,
'open',
'C:\Aplicacion2.exe',
nil,
'C:\',
SW_SHOWNORMAL);
sleep(1000);
PAplicacion2:=findwindow('TAplication2',nil);
if PAplicacion2=0 then begin showmessage('La aplicación 2 no se puede levantada.');
exit;
end;
end;
Resultado:=SendMessage(PVirtualPOS,WM_COPYDATA,Integer(Handle),integer(@CopyDataStruct));
caption:=inttostr(resultado);
end;
Aplicación 2 (receptora)
Código Delphi
[-]
unit fMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ShellApi;
type
TTDatos = packed record
Fecha,
Hora:TDateTime;
Monto,
CantCuotas:real;
MarcaOS:string[1];
NroTicket:int64;
CodBarras:int64;
CodTroquel:integer;
Alfabeta:integer;
CantSolicitada:integer;
TipoBonificacion:string[2];
ValorBonificacion:real;
end;
TDatos = array of TTDatos;
TfrmMain = class(TForm)
private
public
procedure CopiarData(var Msg: TWMCopyData); message WM_COPYDATA;
end;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
procedure TfrmMain.CopiarData(var Msg: TWMCopyData);
var
PDatos:^TDatos;
MisDatos:TDatos;
begin
PDatos:=Msg.CopyDataStruct.lpData;
MisDatos:=PDatos^; Msg.Result:=9999;
end;
end.
Cuando la aplicación 2 recibe el mensaje y trata de acceder al array me da un error de access violations.
Que es lo que no estoy contemplando ???, o, como se debe hacer esto
Saludos cordiales.
Mau