TMemoryStream、String与OleVariant互转

2/10/2017来源:ASP.NET技巧人气:1537

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