zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    笔记35 跨重定向请求传递数
    判断邮箱的正则表达式
    按钮
    async await 的用法
    笔记34 Spring MVC的高级技术——处理multipart形式的数据
    Convert Sorted Array to Binary Search Tree
    Binary Tree Zigzag Level Order Traversal
    Unique Binary Search Trees,Unique Binary Search Trees II
    Validate Binary Search Tree
    Populating Next Right Pointers in Each Node,Populating Next Right Pointers in Each Node II
  • 原文地址:https://www.cnblogs.com/martian6125/p/9631015.html
Copyright © 2011-2022 走看看