OleVariant流到TStringList优化

| 我的服务器通过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例程。 感谢David为我指出了正确的方向,以对代码进行一些调整。 这是更新的过程:
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;
    
已邀请:
您实际上并不需要字符串流。您可以仅调用
SetString()
创建一个包含
dataP
内容的Delphi字符串,然后将该字符串分配给
txt.Text
。如果您具有UTF8数据,则将UTF8字符串传递给
SetString()
。 使用
SetString()
仍涉及中间缓冲区分配,因此我想真正的好选择是一个只读
TStream
后代,您可以传递一个指针和一个大小。您可以将该流传递给
TStrings.LoadFromStream
。写这样的东西很容易。 您实际上是否有性能问题?如果不是,那为什么要改变当前的方法。     

要回复问题请先登录注册