Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi [zlib] AV beim freigeben vom CompressionStream (https://www.delphipraxis.net/103288-%5Bzlib%5D-av-beim-freigeben-vom-compressionstream.html)

gsh 13. Nov 2007 20:34


[zlib] AV beim freigeben vom CompressionStream
 
Hi Leute

Ich hab grad ein problem bei zLib. Ich verwende diesen Code um eine datei zu komprimieren:
Delphi-Quellcode:
procedure Compress(InputFileName, OutputFileName: string);
var InputStream, OutputStream: TFileStream;
  CompressionStream: ZLib.TCompressionStream;
begin
  InputStream:=TFileStream.Create(InputFileName, fmOpenRead);
  try
    OutputStream:=TFileStream.Create(OutputFileName, fmCreate);
    try
      CompressionStream:=TCompressionStream.Create(clMax, OutputStream);
      try
        CompressionStream.CopyFrom(InputStream, InputStream.Size);
      finally
        CompressionStream.Free; //<--- hier kommt die AV
      end;
    finally
      OutputStream.Free;
    end;
  finally
    InputStream.Free;
  end;
end;
Ich verwende die zLib version 1.2.3

gsh 14. Nov 2007 12:41

Re: [zlib] AV beim freigeben vom CompressionStream
 
*push*

gsh 14. Nov 2007 13:17

Re: [zlib] AV beim freigeben vom CompressionStream
 
habs mal mit einem memory stream getestet und da bleibt er schon beim .Create hängen:
Delphi-Quellcode:
  Memory := TMemoryStream.Create;
  try
    Memory.LoadFromFile(cTestDatei);
    Memory.Position := 0;
    MemoryOUT := TMemoryStream.Create;
    try
      MemoryOUT.Size := Memory.Size;
      MemoryOUT.Position := 0;
      CompressionStream := TCompressionStream.Create(clMax, MemoryOUT); //<-- hier
      try
        CompressionStream.CopyFrom(Memory, Memory.Size);
      finally
        CompressionStream.Free;
      end;
    finally
      MemoryOUT.Free;
    end;
  finally
    Memory.Free;
  end;
  Memo.Lines.EndUpdate;
end;
und zwar mit diesem fehler:
Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt PerformanceTester.exe ist eine Exception der Klasse ECompressionError mit der Meldung 'error' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
Ich verstehs nicht ... kann es an meinen .obj liegen? Hab meine von pngimage "geklaut" weil ich sie nirgendwo anderes gefunden hab

gsh 18. Nov 2007 10:47

Re: [zlib] AV beim freigeben vom CompressionStream
 
Weiß denn niemand rat?

Ich versteh die welt einfach nimmer ich schauf es nicht irgendwas mit zLib zusammen zu bekommen

hab grad mal versucht zu dekomprimieren und erhalte den fehler des ich nich genug arbeitsspeicher hab und zwar hier:
Delphi-Quellcode:
function zlibAllocMem(AppData: Pointer; Items, Size: Integer): Pointer; cdecl;
begin
//  GetMem(Result, Items*Size);
  Result := AllocMem(Items * Size);
end;
Was mach ich falsch????? :wall:

phreax 18. Nov 2007 12:23

Re: [zlib] AV beim freigeben vom CompressionStream
 
Da scheint wohl irgendwas mit deiner Zlib Version nicht zu stimmen, dein Code aus dem ersten und der aus dem 3. Post funktionieren einwandfrei unter Turbo Delphi mit Zlib 1.0.4.

BTW: Im 3. Post hat sich ein Fehler eingeschlichen: dadurch, dass die Größe des OutPutStreams auf die des Inputstreams gesetzt wird, werden hinten an den komprimierte Output soviele $00 angehängt, das er wieder genau so groß ist wie der Input ;)

gsh 18. Nov 2007 12:35

Re: [zlib] AV beim freigeben vom CompressionStream
 
Zitat:

Zitat von phreax
Da scheint wohl irgendwas mit deiner Zlib Version nicht zu stimmen, dein Code aus dem ersten und der aus dem 3. Post funktionieren einwandfrei unter Turbo Delphi mit Zlib 1.0.4.

hmm kann es an meinen .obj dateien liegen?
den wie oben erwähnt hab ich die von pngdelphi geklaut weil ich sie nirgends gefunden hab.
hab aber grad endeckt des pngdelphi noch die version 1.1.4 benutzt

Wo bekomm ich den die dateien in der aktuellesten version her?

Zitat:

Zitat von phreax
BTW: Im 3. Post hat sich ein Fehler eingeschlichen: dadurch, dass die Größe des OutPutStreams auf die des Inputstreams gesetzt wird, werden hinten an den komprimierte Output soviele $00 angehängt, das er wieder genau so groß ist wie der Input ;)

aja stimmt aber ich wollte mal fehlerquellen auschließen

gsh 19. Nov 2007 16:16

Re: [zlib] AV beim freigeben vom CompressionStream
 
*push* :duck:

Muetze1 19. Nov 2007 19:04

Re: [zlib] AV beim freigeben vom CompressionStream
 
Ich werde es morgen mal mit BDS2006 testen auf Arbeit, aber ich weise gleich darauf hin, dass wir dort die PNGImage einsetzen und die direkten C Quellen und nicht die Objekte. Dabei sind die C Quellen auf dem neusten Stand (1.2.3 afair) und werden direkt in eine LIB compiliert und dann entweder von Delphi per $L angezogen oder hat von C++. Ich werde es mal testen und Bescheid geben. Wenn ich es vergesse, nochmal nachhaken bitte...

gsh 19. Nov 2007 20:33

Re: [zlib] AV beim freigeben vom CompressionStream
 
ahm ja vllt kannst du mir ja die .obj schicken oder mir sagen wie man die in der neusten version erstellt

hab ja auch BDS2006

gsh 20. Nov 2007 15:59

Re: [zlib] AV beim freigeben vom CompressionStream
 
*nachhack* und?

Muetze1 20. Nov 2007 18:05

Re: [zlib] AV beim freigeben vom CompressionStream
 
Toll, natürlich vergessen. Ok, habe mir es als Termin im PDA eingetragen - mit Alarm - für morgen.

Grundlegend: statische Library anlegen, die C Quellen hinein tun. Die Optionen die in der Batch angegeben wurden zum compilieren, kann man alle in der Oberfläche bei den Projektoptionen wiederfinden und entsprechend setzen. Damit erstellt die Lib schon die .OBJ. Das Ausgabeverzeichnis der statischen LIB muss in den das Unit Sucherverzeichnis des Pascal Projektes, welches die PNGImage bzw. deine Compressionstreams beinhaltet (also die {$L alder32.obj} etc enthält). Danach einfach eine Gruppe erstellen, wo die statische Lib vor dem Pascal Projekt kommt. Dann ist die Gruppe mit dem Make Tool (bzw. unter zu Hilfenahme von bdsproj2mak) auf der Kommandozeile compilierbar, genauso wie in der Oberfläche.

Ich werde es morgen machen...

/EDIT:
Zitat:

Zitat von gsh
*nachhack* und?

Aua - nachhaken hätte schon gereicht, aber gleich hacken? Du gehst ja echt brutal vor...

gsh 20. Nov 2007 18:15

Re: [zlib] AV beim freigeben vom CompressionStream
 
ok danke

Weiß nicht ob ich die erklärung ganz verstanden hab aber des kann ich eh erst morgen probieren

Muetze1 21. Nov 2007 15:48

Re: [zlib] AV beim freigeben vom CompressionStream
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, ich habe es getestet und <trommelwirbel> kein Fehler </trommelwirbel> gefunden bzw. gehabt. Er komprimiert mir ganz kleine Dateien sowie recht grosse (250 MB) ohne Probleme. Ich habe es zum einen mit der zlib von Borland getestet, welche beim BDS2006 mit bei ist und zum anderen mit der zLibEx von den zLib Delphi Implementationen. Dort habe ich die neuen originalen C Quellen übersetzt und dann genutzt. Das Projekt funktioniert genauso gut ohne Fehler, produziert aber ein minimal grösseres Ergebnis (10 KB mehr bei 250 MB), was wohl der neuen zLib Version geschuldet ist.

Ich habe im Anhang eine Projektgruppe, welche folgendes enthält:

1. ein Delphiprojekt zur Nutzung der Originalen Borland Routinen (so wie du es gepostet hast)
2. eine C++ LIB für die Generierung einer LIB, die OBJs sowie der .hpp für die zLib Quellen
3. ein C++ Projekt welches die LIB nutzt und die zLibEx um gleiches zu erreichen.

Auf Wunsch kann ich ja mal mit dem BDS die jeweiligen EXEn und LIBs erzeugen und die kannst du dann ja mal vergleichen, ob es einen binären Unterschied zu deinen erstellten Versionen gibt.

System: Windows XP SP2 (32 Bit), BDS2006, Update pack 2 + HF 10, 11, 12

gsh 21. Nov 2007 19:09

Re: [zlib] AV beim freigeben vom CompressionStream
 
Hi
danke auf jedenfall

Habs jetzt endlich zum laufen bekommen :mrgreen: (nachdem ich alles gelöscht und neu probiert hab)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz