加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

TMemoryStream、String与OleVariant互转

发布时间:2020-12-15 09:56:38 所属栏目:大数据 来源:网络整理
导读:TMemoryStream、String与OleVariant互转 //////////////////////////////////////////////////////////////////////////////// //功能: STRING 的内容流化到 OLEVARIANT 中 //参数: /////////////////////////////////////////////////////////////////////

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;


from:http://www.cnblogs.com/hnxxcxg/archive/2013/02/27/2934790.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读