Delphi : Trasferire Dati da un TMemoryStream a un VarArray
Tecnologie :
Linguaggio : Embarcadero Delphi
Sistema Operativo : Ms-Windows
Piattaforma : W32S
Argomenti :
- Trasferire il contenuto di un
TMemoryStream in un VarArray - Trasferire il contenuto di un VarArray in
un TMemoryStream - Funzione Move pre
spostare grossi blocchi di memoria. Questa è una funzione a basso livello per
esegure spostamenti di dati da RAM a RAM.
Applicazioni :
- creazione di componenti COM e
COM+ - 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;