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

  • 相关阅读:
    iOS开发实用干货——强化你的Xcode控制台
    Android App 性能优化实践
    AFNetworking 之于 https 认证
    点击 Run 之后发生了什么?
    happypack 原理解析
    JavaScript 笔记 ( Prototype )
    成立快两年的安卓绿色联盟,现在怎么样了?
    盘点20款主流应用FPS,最Skr帧率测试方法都在这里!
    探寻百度AI3.0背后的技术实践
    流畅购物哪家强?购物类应用“页面过度绘制”情况调查
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2934790.html
Copyright © 2020-2023  润新知