TMemoryStream、String与OleVariant互转

////////////////////////////////////////////////////////////////////////////////
//功能: STRING 的内容流化到 OLEVARIANT 中
//参数:
////////////////////////////////////////////////////////////////////////////////
function TextToOleData(const AText: string): OleVariant;
var
nSize: Integer;
pData: Pointer;
begin
nSize := Length(AText);
if nSize = 0 then
Result := Null
else begin
Result := VarArrayCreate([0, nSize - 1], varByte);
pData := VarArrayLock(Result);
try
Move(Pchar(AText)^, pData^, nSize);
finally
VarArrayUnlock(Result);
end;
end;
end;

////////////////////////////////////////////////////////////////////////////////
//功能: 由 OLEVARIANT 中加载 STRING 的内容
//参数:
////////////////////////////////////////////////////////////////////////////////
function OleDataToText(const AData: OleVariant): string;
var
nSize: Integer;
pData: Pointer;
begin
if AData = Null then
Result := ''
else begin
nSize := VarArrayHighBound(AData, 1) - VarArrayLowBound(AData, 1) + 1;
SetLength(Result, nSize);
pData := VarArrayLock(AData);
try
Move(pData^, Pchar(Result)^, nSize);
finally
VarArrayUnlock(AData);
end;
end;
end;

 

//转换OLEVariant和TMemoryStream:
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 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 RecordsetToVariant(const Recordset: _Recordset; var Stream: OleVariant): boolean;
var
RS: OleVariant;
vData:TMemoryStream;
begin
Result := false;
if Recordset = nil then Exit;
vData:=TMemoryStream.Create;
try
RS := CreateOleObject('ADODB.Recordset');
RS := Recordset;
RS.Save(TStreamAdapter.Create(vData) as IUnknown, adPersistADTG);
vData.Position := 0;
Result := true;
Stream:=MemoryStreamToOleVariant(vData);
except
on E:Exception do
begin
RS:=E.Message;
Stream:=RS;
Result:=False;
end;
end;
end;
function RecordsetFromVariant(vdata: OleVariant): _Recordset;
var
RS: OleVariant;
Stream:TMemoryStream;
begin
Result := nil;
Stream:=TMemoryStream.Create;
Stream:=OleVariantToMemoryStream(vdata);
if Stream.Size < 1 then Exit;
try
Stream.Position := 0;
RS := CreateOleObject( 'ADODB.Recordset');
RS.Open(TStreamAdapter.Create(Stream) as IUnknown);
Result := IUnknown(RS) as _Recordset;
finally;
end;
end;

posted @ 2013-02-27 11:04  delphi中间件  阅读(8275)  评论(0编辑  收藏  举报