【问题标题】:OleVariant stream to TStringList optimizationOleVariant 流到 TStringList 优化
【发布时间】:2011-08-04 22:56:24
【问题描述】:

我的服务器通过 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;

【问题讨论】:

    标签: delphi com delphi-xe


    【解决方案1】:

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

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

    你真的有性能问题吗?如果不是,那为什么要改变你目前的方法。

    【讨论】:

    • 流可以达到 200 kBytes,所以我很困扰我必须重新分配两次才能得到结果。
    • @LU RD 200kB 真的不算什么。由于之后您可能会使用此数据执行某些操作,因此这可能会占用您通过删除其中一个 realloc 可以节省的时间。但我猜是因为只有你知道你对这段文字做了什么。
    • 性能如您所说不会有问题。我会努力落实您的建议。
    • @LU 为什么要改变?我不确定你是否有迫切需要。
    • 大卫,请参阅我更新的问题。服务器和客户端现在使用 UTF8 可以正常工作。现在我将基于相同的概念实现一个额外的基于 http 的客户端/服务器接口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 2015-01-10
    相关资源
    最近更新 更多