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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
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;</span> MemFile.LoadFromFile(FileName);</span> MemFile.Position := 0; FSize := MemFile.Size; MemFile.Position := 0; V :=VarArrayCreate([0,FSize],varByte); P :=VarArrayLock(V);</strong></span> 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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; |