我正在将应用程序升级到 Delphi 2009。该应用程序使用 Soap,我们使用 Zlib 压缩肥皂请求和响应流。这在 Delphi 2006 中运行良好,但在 Delphi 2009 中却不行。
所以我回到Delphi 2006,改用FastZlib。它在 Delphi2006 中一切正常,但在 Delphi 2009 中不起作用,我得到解压缩错误。
有没有其他人有这个问题?
我该如何解决这个问题?
桑迪普
我正在将应用程序升级到 Delphi 2009。该应用程序使用 Soap,我们使用 Zlib 压缩肥皂请求和响应流。这在 Delphi 2006 中运行良好,但在 Delphi 2009 中却不行。
所以我回到Delphi 2006,改用FastZlib。它在 Delphi2006 中一切正常,但在 Delphi 2009 中不起作用,我得到解压缩错误。
有没有其他人有这个问题?
我该如何解决这个问题?
桑迪普
可能值得尝试的东西 - 压缩您的数据,然后对其进行 UUENCODE,然后在另一端反转该过程。这将检测某些代码是否没有正确处理嵌入的零。
抱歉,这只是帮助您缩小问题范围的部分解决方案。
在 D2009 中你可以使用 ZCompress/ZDecompress 代替 CompressBuf/DecompressBuf
我测试它没有问题。
我刚刚查看了内置的 Zlib.pas,它似乎已针对 D2009 进行了正确更新。什么给你带来问题?
在 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 中工作?
原始海报清楚地说明了这个问题:CompressBuf 和 DecompressBuf 都消失了。
我还有一个项目在 D7 中编译得很好,但在 D2010 中编译失败,因为它找不到“CompressBuf”或“DecompressBuf”。
使用 D7 非常令人愉快的 find 命令进行搜索,将例程定位在 c:\Program Files\Borland\Delphi7\Source\Rtl\Common\ZLib.pas
但是使用 D2010 的(单独的尴尬)“在文件中查找”命令搜索无法在任何地方找到 CompressBuf 或 DecompressBuf。
升级 IDE 会导致项目中使用和需要的例程消失,这非常令人不安!