3 Stimmen

Zlib in Delphi 2009

Ich aktualisiere eine Anwendung auf Delphi 2009. Die Anwendung verwendet Soap und wir komprimieren die Soap-Anfrage und Antwort-Streams mit Zlib. Dies funktioniert gut in Delphi 2006, aber nicht in Delphi 2009.

Also ging ich zurück zu Delphi 2006 und wechselte zur Verwendung von FastZlib. Es funktionierte alles gut in Delphi2006, aber nicht in Delphi 2009 arbeiten und ich bekomme Decompress Fehler.

Hatte noch jemand dieses Problem?

Wie kann ich das in Ordnung bringen?

Sandeep

1 Stimmen

Es wäre hilfreich, wenn Sie die Fehler und vielleicht etwas Code posten würden?

0 Stimmen

Sie müssen uns genau sagen, welche Fehler Sie erhalten und welche Funktion Sie aufgerufen haben, als Sie sie erhielten.

1 Stimmen

Ich vermute, dass FastZlib PChar anstelle von PAnsiChar verwendet. In Delphi 2009 SizeOf(Char) = 2 und nicht 1 Byte, wie es in Delphi 2006 war.

1voto

XBasic3000 Punkte 3368

In D2009 können Sie ZCompress/ZDecompress anstelle von CompressBuf/DecompressBuf verwenden
Ich teste es und es gibt kein Problem.

0voto

Mason Wheeler Punkte 79858

Ich habe mir gerade die integrierte Zlib.pas angesehen und sie scheint für D2009 aktualisiert worden zu sein. Was macht Ihnen Probleme?

0voto

In Delphi 2006 hatte ich folgende Methoden zum Komprimieren und Dekomprimieren mit Zlib (aus 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;

Was muss ich ändern, damit sie in Delphi 2009 funktionieren?

0voto

Ein Versuch könnte sich lohnen: Komprimieren Sie Ihre Daten, und dann UUENCODE sie, und auf der anderen Seite, den Prozess umkehren. Auf diese Weise lässt sich feststellen, ob ein Code mit eingebetteten Nullen nicht richtig umgeht.

Dies ist leider nur eine Teillösung, die Ihnen helfen soll, das Problem einzugrenzen.

0voto

Kevin Killion Punkte 1

Der ursprüngliche Poster war klar über das Problem: CompressBuf und DecompressBuf sind GONE.

Ich habe auch ein Projekt, das kompiliert gerade gut in D7, aber nicht in D2010 kompilieren, weil es "CompressBuf" oder "DecompressBuf" nicht finden kann.

Eine Suche mit dem sehr angenehmen find-Befehl von D7 findet die Routinen unter c: \Program Dateien \Borland\Delphi7\Source\Rtl\Common\ZLib.pas

Aber die Suche mit dem (umständlichen separaten) "Find in Files"-Befehl von D2010 kann CompressBuf oder DecompressBuf nirgends finden.

Es ist sehr beunruhigend, dass ein Upgrade der IDE dazu führt, dass Routinen, die in Projekten verwendet und benötigt werden, verschwinden!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X