TMemoryStream、String与OleVariant互转

TMemoryStreamStringOleVariant互转

 


//
功能: 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;



//
转换OLEVariantTMemoryStream:
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;

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值