首页  编辑  

Variant和Stream的转换

Tags: /超级猛料/COM、ActiveX,DDE/   Date Created:
Variant 和Stream的转换
function FileToVariant(FileName: String): OleVariant;
var
 AStream: TFileStream;
 MyBuffer: Pointer;
begin
 AStream:=TFileStream.create(FileName,fmOpenRead);
 try
   aStream.Seek(0, soFromBeginning);
   Result:=VarArraycreate([0, AStream.size-1], VarByte);
   MyBuffer:=VarArrayLock(Result);
   AStream.ReadBuffer(MyBuffer^, AStream.Size);
   VarArrayUnlock(Result);
 finally
   AStream.Free;
 end;
end;
procedure VariantToFile(FileName: String; var AVariant: OleVariant);
var
 AStream: TFileStream;
 MyBuffer: Pointer;
 Size: Integer;
begin
 AStream:=TFileStream.create(FileName,fmCreate);
 try
   aStream.Seek(0, soFromBeginning);
   Size:=VarArrayHighBound(AVariant,1)+VarArrayLowBound(AVariant,1)+1;
   MyBuffer:=VarArrayLock(AVariant);
   AStream.WriteBuffer(MyBuffer^, Size);
   VarArrayUnlock(AVariant);
 finally
   AStream.Free;
 end;
end;
procedure VariantToStream (const v : olevariant;
                                 Stream : TMemoryStream);
var
 p : pointer;
begin
 Stream.Position := 0;
 Stream.Size := VarArrayHighBound (v, 1) - VarArrayLowBound(v,  1) + 1;
p := VarArrayLock (v);
 Stream.Write (p^, Stream.Size);
 VarArrayUnlock (v);
 Stream.Position := 0;
end;
procedure StreamToVariant (Stream : TMemoryStream; var v : OleVariant);
var
 p : pointer;
begin
 v := VarArrayCreate ([0, Stream.Size - 1], varByte);
 p := VarArrayLock (v);
 Stream.Position := 0;
 Stream.Read (p^, Stream.Size);
 VarArrayUnlock (v);
end;