Via Cà Matta 2 - Peschiera Borromeo (MI)
+39 02 00704272
info@synaptica.info

Delphi : Trasferire Dati da un TMemoryStream a un VarArray

Digital Innovation Partner

Delphi : Trasferire Dati da un TMemoryStream a un VarArray

Tecnologie :

Linguaggio : Embarcadero Delphi

Sistema Operativo : Ms-Windows

Piattaforma : W32S

Argomenti :

  1. Trasferire il contenuto di un
    TMemoryStream in un VarArray
  2. Trasferire il contenuto di un VarArray in
    un TMemoryStream
  3. Funzione Move pre
    spostare grossi blocchi di memoria. Questa è una funzione a basso livello per
    esegure spostamenti di dati da RAM a RAM.

Applicazioni :

  1. creazione di componenti COM e
    COM+
  2. scrittura di oggetti per gli ambienti
    microsoft con Delphi

 

La seguente funzione legge il contenuto di un file e lo porta in memoria per mezzo
di un TMemoryStream a questo punto il contenuto del TMemoryStream viene copiato
in un VarArray.

function GetFile(FileName: TFileName):OleVariant;
Var
MemFile : TMemoryStream;
S       : String;
FSize   : Integer;
V       : Variant;
P       : PByteArray;
begin
If FileExists(FileName) then 
Begin
Try
MemFile := TMemoryStream.Create;

MemFile.LoadFromFile(FileName);
MemFile.Position := 0;
FSize := MemFile.Size;
MemFile.Position := 0;
V :=VarArrayCreate([0,FSize],varByte);
P :=VarArrayLock(V);
Move(MemFile.memory^,P^,FSize);
VarArrayUnlock(V);

MemFile.Free;
Result :=V;
// V[0] -- primo byte del file
Except
On E:Exception
do
Begin
  Result := E.Message;
End;
End;

End
Else
ShowMessage('Il File : [' + FileName + '] non esiste');
end;

La seguente funzione legge il contenuto di un VarArray e lo salva su disco per
mezzo di un TMemoryStream.

procedure SaveVarArrayToFile(V : Variant;FName : TFileName);
Var
I       : Byte;
VSize   : Int64;
J       : Integer;
MemFile : TMemoryStream;
P       : PByteArray;
begin
MemFile := TMemoryStream.Create;


VSize := VarArrayHighBound(V,1);  (* legge la dimensione del VarArray *)
MemFile.SetSize(VSize);          (* imposta la dimensione del TMemoryStream *)
MemFile.Position := 0;
P := VarArrayLock(V);  (* Legge il puntatore del VarArray nello HeapMemory e blocca la scrittura sul vararray *)
Move(P^,MemFile.memory^,VSize); (* sposta i dati dall'array allo stream *)
VarArrayUnlock(V);     (* sblocca la scrittura del variant*)
MemFile.SaveToFile(FName); (*salvo il contenuto dello stream sul file*)
MemFile.Free;
end;

Lascia un commento