Ver Mensaje Individual
  #5  
Antiguo 26-10-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Reputación: 22
ArdiIIa Va por buen camino
Código Delphi [-]
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShellApi;
type
  TTest = packed record
    Nombre,
    Apellido:string[30];
  end;
  ATEST=array of TTest;
 
  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
  PTest:^ATEST;
  FicheroM: THandle;
begin
 
   //Para el caso de un array, debo pasar como longitud la suma de todos sus miembros ??
   FicheroM:=CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,SizeOf(TTest),'Datos');
  PTest:=MapViewOfFile(FicheroM,FILE_MAP_WRITE,0,0,0);
 
  with Ptest^[0] do //Esto genera un error
  begin
    Nombre:='Pepe';
    Apellido:='Alonso';
  end;
 
  with Ptest^[1] do
  begin
    Nombre:='Ludovico';
    Apellido:='Pio';
  end;
 
  UnmapViewOfFile(PTest);  
 
  CloseHandle(FicheroM);
 
end;
end.

Bueno, creo que la clave está es que estás intentando pasar un array de registros, pero no has reservado memoria para cada dicho array.
si verificas esto:
Código Delphi [-]
SizeOf(TTest)
antes de mapear, verás el problema.

Si leíste aquel hilo tal como te dije, también citaba esa posibilidad, reservando memoria mediante VirtualAllocEx

Recuerda que no puedes asignar elementos a un array vacio....

Luego examinando tu código, primeramente diría que la declaración del registro es incorrecta, dado que debes crear un puntero al registro.... en este caso PDatitos..

Código Delphi [-]
PDatitos = ^TDatitos;
TDatidos = packed record
    Dato_1    : Cardinal;   
    Dato_2    : Cardinal;   
    Dato_Main    : Cardinal; 
    Virtual_Mem_Adr  : Pointer;  // Dirección de memoria donde se aloja algo 
    Virtual_Men_Size : LongWord; // Longitud de memoria donde se aloja ese algo
    Etc_1 : Boolean;
end;


y luego crear o defirnir el array de una longitud fija....

Código Delphi [-]
Test_Array : Array [0..10] of TDatitos;


o dinámica

Código Delphi [-]
Test_Array: Array  of TDatitos;

En este caso debería ir asignando memória para cada elemento.

Luego podría hacer hago tal que esto para asignar valores al array


Código Delphi [-]
Test_Array[0].Dato_1 := 15;

Suerte.
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita