2009-06-03 27 views
3

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

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

У кого-нибудь еще была эта проблема?

Как я могу это исправить?

Sandeep

+1

это поможет, если вы разместите ошибки и, возможно, какой-нибудь код? – Cheeso

+0

Действительно, вам нужно сообщить нам, какие точные ошибки вы получаете и какую функцию вы вызывали, когда вы их получили. –

+1

Я предполагаю, что FastZlib использует PChar вместо PAnsiChar. В Delphi 2009 SizeOf (Char) = 2, а не 1 байт, как это было в Delphi 2006. –

ответ

0

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

0

В Дельфах 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?

+0

Hm, вы регистрируетесь как другой пользователь. Вместо этого войдите в систему, используя то же имя пользователя, которое вы использовали, чтобы опубликовать вопрос и отредактировать его. –

0

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

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

0

Оригинальный плакат был прояснен по поводу проблемы: CompressBuf и DecompressBuf GONE.

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

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

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

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

+1

'CompressBuf' и' DecompressBuf' были переименованы в 'ZCompress' и' ZDecompress', соответственно. Это произошло между 2007 и XE, но я точно не знаю, когда у меня нет 2009 или 2010 установленных. Если бы мне пришлось опасаться догадки, я бы сказал, что это случилось с 2009 годом. – afrazier

0

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