delphi Variant 与 流(TStream)相互转换

发布时间 2023-04-23 15:49:03作者: txgh

Variant 与 流(TStream)相互转换

代码

Variant转TStream

procedure VariantToStream(Stream: TStream; const Value: Variant);
var
  p: Pointer;
begin
  if VarIsNull(Value) or VarIsEmpty(Value) then
    Exit;
  Stream.Size := VarArrayHighBound(Value, 1) - VarArrayLowBound(Value, 1) + 1;
  p := VarArrayLock(Value);
  try
    Stream.position := 0;
    Stream.Write(p^, Stream.Size);
    Stream.position := 0;
  finally
    VarArrayUnlock(Value);
  end;
end; 

TStream转Variant

function StreamToVariant(Stream: TStream): Variant;
var
  p: Pointer;
begin
  if Stream.Size = 0 then
    Exit(Null);
  Result := VarArrayCreate([0, Stream.Size - 1], varByte);
  p := VarArrayLock(Result);
  try
    Stream.position := 0;
    Stream.Read(p^, Stream.Size)
  finally
    VarArrayUnlock(Result);
  end;
end;

方法

System.Variants.VarArrayLock

function VarArrayLock(const A: Variant): Pointer;

锁定变体数组并返回指向数据的指针。

锁定时,无法调整变体数组的大小,任何对VarArrayRedim的调用都会失败。锁定后,变体数组必须在以后使用VarArrayUnlock来解锁。如果 A 给出的变体不是数组,则会引发 EVariantInvalidArgError 异常。

一旦验证变体数组具有正确的边界和维度,就可以使用 VarArrayLock 来直接访问数组数据,从而提高性能。

System.Variants.VarArrayUnlock

procedure VarArrayUnlock(const A: Variant);

解锁之前被 VarArrayLock 锁定的变体数组。如果 A 给出的变体不是数组,则会引发 EVariantInvalidArgError 异常。