Ver Mensaje Individual
  #1  
Antiguo 25-10-2007
mauqu mauqu is offline
Miembro
 
Registrado: may 2007
Posts: 28
Reputación: 0
mauqu Va por buen camino
pasar un tipo de datos (array of record) entre aplicaciones

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
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  Test:array of TTest;
  //Estructura de datos para la info de la transacción
  CopyDataStruct:TCopyDataStruct;
  PAplicacion2:Thandle; //El manejador del soft 2
  Resultado:integer; 
  regs:integer;
begin
  regs:=2;
  SetLength(Test,regs);
  //Cargar los datos de la transacción
  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;  
  //Copiar los datos de la transacción
  CopyDataStruct.dwData := 2; //Estructura
  CopyDataStruct.cbData := SizeOf(Test)*regs;
  CopyDataStruct.lpData := @Test;
 
  //Buscar el soft 2
  PAplicacion2:=findwindow('TAplication2',nil);
  if PAplicacion2 = 0 then begin //Si no lo encuentra
    //Ejecutar el soft 2
    ShellExecute(handle,
                 'open',
                 'C:\Aplicacion2.exe',
                 nil,
                 'C:\',
                 SW_SHOWNORMAL);
    sleep(1000);    
    //Buscar el soft 2
    PAplicacion2:=findwindow('TAplication2',nil);
    if PAplicacion2=0 then begin //Si no lo cuentra
      showmessage('La aplicación 2 no se puede levantada.');
      exit;
    end;
  end;
  //Enviar el mensaje WM_COPYDATA al soft 2 pasandole los datos de la transacción
  //  el mensaje de vuelta.
  Resultado:=SendMessage(PVirtualPOS,WM_COPYDATA,Integer(Handle),integer(@CopyDataStruct));
  //Mostramos el resultado.
  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
    { Private declarations }
  public
    { Public declarations }
    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^; // ERROR
  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
Responder Con Cita