• 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;

  • 相关阅读:
    基于 WebGL 的 HTML5 楼宇自控 3D 可视化监控
    基于 HTML5 的 WebGL 楼宇自控 3D 可视化监控
    基于 WebGL 3D 的 HTML5 档案馆可视化管理系统
    基于 HTML5 的 WebGL 3D 档案馆可视化管理系统
    基于 HTML5 的 WebGL 和 VR 技术的 3D 机房数据中心可视化
    代码管理(四)SVN和Git对比
    代码管理(二)sourcetree 安装与使用
    代码管理(一)git
    iOS11新特性之LargeTitle
    使用Cordova搭建Andoid和iOS开发环境
  • 原文地址:https://www.cnblogs.com/martian6125/p/9631015.html
Copyright © 2020-2023  润新知