2009-06-03 10 views
3

Ich aktualisiere eine App auf Delphi 2009. Die App verwendet Soap und wir komprimieren die Soap Request und Response-Streams mit Zlib. Dies funktioniert in Delphi 2006, aber nicht in Delphi 2009.Zlib in Delphi 2009

Also ging ich zurück zu Delphi 2006 und änderte, um FastZlib zu verwenden. In Delphi 2006 hat alles funktioniert, funktioniert aber in Delphi 2009 nicht und ich bekomme Dekomprimierungsfehler.

Hat jemand anderes dieses Problem?

Wie kann ich das beheben?

Sandeep

+1

es würde helfen, wenn Sie die Fehler und vielleicht etwas Code gepostet? – Cheeso

+0

In der Tat müssen Sie uns sagen, welche genauen Fehler Sie erhalten und welche Funktion Sie angerufen haben, als Sie sie bekommen haben. –

+1

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

Antwort

0

Ich sah nur durch die eingebaute in Zlib.pas und es scheint für D2009 ordnungsgemäß aktualisiert wurden. Was gibt dir Probleme?

0

In delphi 2006 hatte ich folgenden Methoden Zlib zum Komprimieren und Dekomprimieren (von 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 soll ich für diese ändern in Delphi 2009 zu arbeiten?

+0

Hm, Sie loggen sich als ein anderer Benutzer ein. Melden Sie sich stattdessen mit demselben Benutzernamen an, mit dem Sie die Frage gepostet und bearbeitet haben. –

0

Etwas, das einen Versuch wert sein könnte - komprimieren Sie Ihre Daten, und dann UUENCODE es, und auf der anderen Seite, den Prozess umzukehren. Dadurch wird erkannt, ob Code nicht ordnungsgemäß mit eingebetteten Nullen arbeitet.

Entschuldigung, dies ist nur eine Teillösung, um das Problem einzugrenzen.

0

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

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

Eine Suche D7 ist sehr angenehm empfinden Befehl sucht die Routinen bei c: \ Programme \ Borland \ Delphi7 \ Source \ Rtl \ Common \ ZLib.pas

Aber mit (umständlich getrennt) des D2010 Suche „finden im Befehl "Dateien" kann CompressBuf oder DecompressBuf nirgendwo finden.

Es ist sehr beunruhigend, dass ein Upgrade der IDE dazu führt, dass in Projekten verwendete und benötigte Routinen verschwinden!

+1

'CompressBuf' und' DecompressBuf' wurden in 'ZCompress' bzw.' ZDecompress' umbenannt. Es ist zwischen 2007 und XE passiert, aber ich bin mir nicht sicher, wann genau ich 2009 oder 2010 nicht installiert habe. Wenn ich raten müsste, würde ich sagen, dass es 2009 passierte. – afrazier

0

in D2009 können Sie ZCompress/ZDecompress anstelle von CompressBuf/DecompressBuf
ich es testen und es gibt kein Problem.