Поток OleVariant для оптимизации TStringList - PullRequest
1 голос
/ 13 апреля 2011

Мой сервер возвращает поток строк как OleVariant через вызов COM / DCOM.Этот код хорошо работает для клиента, но, вероятно, может быть улучшен.Подсказки приветствуются.

И, как следствие, что, если сервер возвращает поток 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 означает, что в сети используется меньшая пропускная способность, и я могу более или менее использовать подпрограммы COM / DCOM при дальнейшей реализации интерфейса протокола http на основе строк UTF8.

Спасибо Дэвиддля направления меня в правильном направлении, чтобы немного урезать код.

Вот обновленная процедура:

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 Ответ

2 голосов
/ 13 апреля 2011

Вам не нужен поток строк. Вы можете просто вызвать SetString(), чтобы создать строку Delphi, содержащую содержимое dataP, а затем назначить эту строку для txt.Text. Если у вас есть данные UTF8, передайте строку UTF8 в SetString().

Использование SetString() все еще подразумевает промежуточное выделение буфера, поэтому я думаю, что было бы неплохо, если бы он был только для чтения TStream и мог бы передавать указатель и размер. Вы можете передать этот поток в TStrings.LoadFromStream. Было бы достаточно легко написать такую ​​вещь.

У вас действительно есть проблемы с производительностью? Если нет, то зачем переходить от вашего текущего подхода.

...