Злиб в Delphi 2009

Я обновляю приложение до Delphi 2009. Приложение использует Soap, и мы сжимаем потоки запросов и ответов мыла с помощью Zlib. Это отлично работает в Delphi 2006, но не в Delphi 2009.

Поэтому я вернулся к Delphi 2006 и перешел на FastZlib. Все это отлично работало в Delphi2006, но не работает в Delphi 2009, и я получаю ошибки Decompress.

У кого еще возникла эта проблема?

Как мне это исправить?

Сандип


person Community    schedule 03.06.2009    source источник
comment
это поможет, если вы разместите ошибки и, возможно, какой-то код?   -  person Cheeso    schedule 03.06.2009
comment
Действительно, вам нужно сообщить нам, какие именно ошибки вы получаете и какую функцию вы вызывали, когда они у вас возникли.   -  person Jon Bright    schedule 03.06.2009
comment
Я предполагаю, что FastZlib использует PChar вместо PAnsiChar. В Delphi 2009 SizeOf (Char) = 2, а не 1 байт, как в Delphi 2006.   -  person Andreas Hausladen    schedule 03.06.2009


Ответы (5)


Я только что просмотрел встроенный Zlib.pas, и, похоже, он был правильно обновлен для D2009. Что доставляет вам проблемы?

person Mason Wheeler    schedule 03.06.2009

В delphi 2006 у меня были следующие методы сжатия и распаковки с помощью Zlib (из Delphi 2006)

procedure CompressStream(inpStream, outStream: TStream);
var
  InpBuf, OutBuf: Pointer;
  InpBytes, OutBytes: Integer;
begin
  InpBuf := nil;
  OutBuf := nil;
  try
    GetMem(InpBuf, inpStream.Size);
    inpStream.Position := 0;
    InpBytes := inpStream.Read(InpBuf^, inpStream.Size);
    CompressBuf(InpBuf, InpBytes, OutBuf, OutBytes);
    outStream.Write(OutBuf^, OutBytes);
  finally
    if InpBuf <> nil then FreeMem(InpBuf);
    if OutBuf <> nil then FreeMem(OutBuf);
  end;
end;


{ Decompress a stream }
procedure DecompressStream(inpStream, outStream: TStream);
var
  InpBuf, OutBuf: Pointer;
  OutBytes, sz: Integer;
begin
  InpBuf := nil;
  OutBuf := nil;
  sz     := inpStream.Size - inpStream.Position;
  if sz > 0 then 
    try
      GetMem(InpBuf, sz);
      inpStream.Read(InpBuf^, sz);
      DecompressBuf(InpBuf, sz, 0, OutBuf, OutBytes);
      outStream.Write(OutBuf^, OutBytes);
    finally
      if InpBuf <> nil then FreeMem(InpBuf);
      if OutBuf <> nil then FreeMem(OutBuf);
    end;
  outStream.Position := 0;
end;

Что мне нужно изменить, чтобы они работали в Delphi 2009?

person Community    schedule 03.06.2009
comment
Хм, вы заходите под другим пользователем. Вместо этого войдите в систему, используя то же имя пользователя, которое вы использовали для публикации вопроса, и отредактируйте его. - person Leonardo Herrera; 03.02.2011

Что-то, что, возможно, стоит попробовать - сжать ваши данные, а затем UUENCODE их, а с другой стороны, отменить процесс. Это позволит определить, не работает ли какой-либо код со встроенными нулями должным образом.

Извините, это лишь частичное решение, которое поможет вам сузить проблему.

person Community    schedule 11.06.2009

В оригинальном плакате проблема была ясна: CompressBuf и DecompressBuf УДАЛИСЬ.

У меня также есть проект, который отлично компилируется в D7, но не может быть скомпилирован в D2010, потому что не может найти «CompressBuf» или «DecompressBuf».

Поиск с использованием очень приятной команды поиска D7 находит подпрограммы в c: \ Program Files \ Borland \ Delphi7 \ Source \ Rtl \ Common \ ZLib.pas

Но поиск с помощью команды D2010 (неудобно отдельно) «Найти в файлах» не может найти где-либо CompressBuf или DecompressBuf.

Очень беспокоит то, что обновление IDE приводит к исчезновению подпрограмм, используемых и необходимых в проектах!

person Kevin Killion    schedule 25.01.2010
comment
CompressBuf и DecompressBuf были переименованы в ZCompress и ZDecompress соответственно. Это произошло между 2007 годом и XE, но я не уверен, когда именно, поскольку у меня не установлен 2009 или 2010. Если бы я рискнул предположить, я бы сказал, что это случилось с 2009 годом. - person afrazier; 11.06.2012

в D2009 вы можете использовать ZCompress / ZDecompress вместо CompressBuf / DecompressBuf. Я тестирую его, и проблем нет.

person XBasic3000    schedule 01.03.2013