function MemoryStreamToOleVariant(Strm: TMemoryStream):OleVariant;
var
Data: PByteArray;
begin
Result := VarArrayCreate ([0, Strm.Size - 1], varByte);
Data := VarArrayLock(Result);
try
Strm.Position := 0;
Strm.ReadBuffer(Data^, Strm.Size);
finally
VarArrayUnlock(Result);
end;
end;
function VariantArrayToString(const V: OleVariant): string;
var
P: Pointer;
Size: Integer;
begin
Result := '';
if VarIsArray(V) and (VarType(V) and varTypeMask = varByte) then
begin
Size := VarArrayHighBound(V, 1) - VarArrayLowBound(V, 1) + 1;
if Size > 0 then
begin
SetLength(Result, Size);
P := VarArrayLock(V);
try
Move(P^, Result[1], Size);
finally
VarArrayUnlock(V);
end;
end;
end;
end;
function OleVariantToMemoryStream(OV: OleVariant):TMemoryStream;
var
Data: PByteArray;
Size: integer;
begin
Result := TMemoryStream.Create;
try
Size := VarArrayHighBound (OV, 1) - VarArrayLowBound
(OV, 1) + 1;
Data := VarArrayLock(OV);
try
Result.Position := 0;
Result.WriteBuffer(Data^, Size);
finally
VarArrayUnlock(OV);
end;
except
Result.Free;
Result := nil;
end;
end;
function VariantToString(const vData:Variant):string;
var
Int_,vType,Size:Integer;
Smallint_:Smallint;
Single_ :Single;
Double_ :Double;
b:Byte;
Value:string;
begin
vType := VarType(vData);
if vType = varOleStr then vType := varString;
Result := MoveVarToStr(vType,Sizeof(Integer));
case vType of
varEmpty,varNull: begin end;
varSmallint:
begin
Smallint_ := vData;
Result := Result + MoveVarToStr(Smallint_,Sizeof(Smallint_));
end;
varInteger :
begin
int_ := vData;
Result := Result + MoveVarToStr(int_,Sizeof(int_));
end;
VarSingle:
begin
Single_ := vData;
Result := Result + MoveVarToStr(Single_,Sizeof(Single_));
end;
varDouble,varCurrency,varDate:
begin
Double_ := vData;
Result := Result + MoveVarToStr(Double_,Sizeof(Double_));
end;
varBoolean:
begin
if Boolean(vData) then b := 1 else b := 0;
Result := Result + char(b);
end;
varByte:
begin
b := vData;
Result := Result + char(b);
end;
varString {,varOleStr} :
begin
Value := vData;
Size :=Length(Value);
Result := Result + MoveVarToStr(Size,Sizeof(Integer)) +
MoveVarToStr(Pointer(Value)^,Size);
end;
varArray or VarByte:
begin
Value := Sharetools.VariantArrayToString(vData);
Size :=Length(Value);
Result := Result + MoveVarToStr(Size,Sizeof(Integer)) +
MoveVarToStr(Pointer(Value)^,Size);
end;
else
raise exception.Create('UnKnow Type');
end;
end;
function MoveVarToStr(var P;iSize:Integer):string;
begin
SetLength(Result,iSize);
Move(Pointer(P),Pointer(Result)^,iSize);
end;