OleVariant流到TStringList优化

时间:2011-04-13 18:24:03

标签: delphi com delphi-xe

我的服务器通过COM / DCOM调用将字符串流作为OleVariant返回。 此代码适用于客户端,但可能会得到改进。 欢迎提示。

作为后续操作,如果服务器将OleVariant流作为UTF-8返回, 客户端将其转换为unicode的最佳方式是什么?

procedure TClientToServer.GetText(       mode     : integer;
                                                 const infoText : widestring;
                                                      txt         : TStrings);
var
  size        : integer;
  dataP       : pointer;
  data        : OleVariant;
  strStream   : TStringStream;
begin
  txt.Clear;
  data:= fDComServer.GetData( mode,infoText);
  if VarIsNull(data) then Exit;
  size:= VarArrayHighBound(data,1) + 1;
  dataP:= VarArrayLock( data);
  try
    strStream:= TStringStream.Create;
    try
      strStream.Write( dataP^,size);
      strStream.Seek(0,0);
      txt.LoadFromStream( strStream);
    finally
      strStream.Free;
    end;
  finally
    VarArrayUnlock( data);
  end;
end;

编辑:   使用UTF8意味着在网络上使用更少的带宽,并且在稍后实现基于UTF8字符串的http协议接口时,我可以或多或少地重用COM / DCOM例程。

感谢大卫指出我正确的方向来修改代码。

以下是更新程序:

procedure TClientToServer.GetText(       mode     : integer;
                                   const infoText : widestring;
                                         txt         : TStrings);
var
  size    : integer;
  dataP   : Pointer;
  data    : OleVariant;
  utf8Str : Utf8String;
begin
  txt.Clear;
  data:= fDComServer.GetData( mode,infoText);
  if VarIsNull(data) then Exit;
  size:= VarArrayHighBound(data,1) + 1;
  dataP:= VarArrayLock( data);
  try
    SetString( utf8Str, PAnsiChar(dataP), size);
    txt.Text:= utf8Str;
  finally
    VarArrayUnlock( data);
  end;
end;

1 个答案:

答案 0 :(得分:2)

你真的不需要字符串流。您只需调用SetString()即可创建包含dataP内容的Delphi字符串,然后将该字符串分配给txt.Text。如果您有UTF8数据,则将UTF8字符串传递给SetString()

使用SetString()仍然需要一个中间缓冲区分配,所以我想真正好的是一个只读TStream后代,你可以传递一个指针和一个大小。您可以将该流传递给TStrings.LoadFromStream。写这样的东西很容易。

你真的遇到了性能问题吗?如果没有,那么为什么要改变你目前的做法。