| |
|
|
- Seite 1 - |
|
Frank Abbing | Daten packen ohne Dll, nur mittels API.
================================================================================
================================================================================/
Daten packen/entpacken ohne Dll, nur mittels API.
© 2008 Frank Abbing, http://frabbing.de
Def RtlCompressBuffer(8) !"ntdll.dll", "RtlCompressBuffer"
Def RtlDecompressBuffer(6) !"ntdll.dll", "RtlDecompressBuffer"
Def RtlGetCompressionWorkSpaceSize(3) !"ntdll.dll", "RtlGetCompressionWorkSpaceSize"
Def RtlMoveMemory(3) !"kernel32.dll", "RtlMoveMemory"
Speicherbereich packen. Parameter: (Speicherbereich, Anzahl Bytes im Speicherbereich)
Proc CompressBuffer
Parameters bbereich#, cbx&
Declare cstatus&, bworkspacesize&, fworkspacesize&, cbereich#, workspace#
cstatus&=0
IfNot RtlGetCompressionWorkSpaceSize(2, Addr(bworkspacesize&), Addr(fworkspacesize&))
Dim workspace#,bworkspacesize&
Dim cbereich#,cbx&+400
IfNot RtlCompressBuffer(2,bbereich#,cbx&,cbereich#,cbx&+400,0,Addr(bworkspacesize&),workspace#)
Clear bbereich#
Long bbereich#,0=cbx&
RtlMoveMemory(bbereich#+4,cbereich#,bworkspacesize&)
cstatus&=bworkspacesize&+4
EndIf
Dispose workspace#
Dispose cbereich#
Endif
Return cstatus&
Rückgabe: Anzahl der gepackten Bytes. Die gepackten Daten wurden in den übergebenen Speicherbereich kopiert.
EndProc
Originale Speichergrösse ermitteln. Parameter: (gepackter Speicherbereich#)
Proc GetDecompressSize
Parameters bbereich#
Return Long(bbereich#,0)
EndProc
Speicherbereich entpacken. Parameter: (gepackter Speicherbereich, Anzahl Bytes im gepackten Speicherbereich, freier Speicherbereich)
Proc DecompressBuffer
Parameters bbereich#, cbx&, cbereich#
Declare bworkspacesize&
IfNot RtlDecompressBuffer(2,cbereich#,Long(bbereich#,0),bbereich#+4,cbx&-4,Addr(bworkspacesize&))
Return bworkspacesize&
EndIf
Return 0
Rückgabe: Anzahl der entgepackten Bytes.
EndProc
================================================================================
================================================================================/
====> HAUPTPROGRAMM
Declare bereich#, bereich2#, text$, x&, xcopy&, newbytes&
Cls
While 1
text$=LoadFile$("Datei zum Packen aussuchen","")
If text$<>""
Packen testen
x&=FileSize(text$)
xcopy&=x&
If x&
Dim bereich#, x&+400
BlockRead(text$, bereich#, 0, x&)
newbytes&=CompressBuffer(bereich#, x&)
If newbytes&
Set("Decimals",2)
Print "Dateiname: "+text$
Print "Originalgrösse liegt bei "+Str$(x&)+" Bytes, comprimiert bei "+Str$(newbytes&)+" Bytes."
Print "Packrate liegt bei "+Str$(100-(newbytes&*100/x&))+" Prozent."
text$=text$+".pck"
BlockWrite text$, bereich#, 0, newbytes&
Dispose bereich#
Entpacken testen
x&=FileSize(text$)
If x&
Dim bereich#, x&
BlockRead(text$, bereich#, 0, x&)
newbytes&=GetDecompressSize(bereich#)
Dim bereich2#,newbytes&
x&=DecompressBuffer(bereich#, x&, bereich2#)
If x&
text$=text$+".org"
BlockWrite text$, bereich2#, 0, x&
Print "Dateiname: "+text$
Print "Decomprimierte Originalgrösse beträgt "+Str$(x&)+" Bytes."
Print
Else
Print text$+" konnte nicht entpackt werden."
Print
EndIf
Dispose bereich2#
Dispose bereich#
EndIf
Else
Dispose bereich#
Print text$+" konnte nicht gepackt werden."
EndIf
EndIf
Else
BREAK
EndIf
EndWhile
WaitInput
End
|
|
|
| |
|
|
|
| |
|
- Seite 1 - |
|
Frank Abbing | Welche Windowsversion (bitte in der Signatur angeben )? Huh, Zeile 413? Soviel Zeilen hat der Code ja bei Weitem nicht. Da der Source beigelegt ist, kannst du gerne die Ursache erforschen. Meine Tests verliefen alle fehlerfrei. |
|
|
| |
|
|
|
Bernhard Künzel | Hallo Frank, Win Version XP Home SP2 Profan Version XProfan11ßRC9 Test mit deiner Compress.exe: In der MessageBox kommt die Fehlermeldung "Zu wenig Speicher für Bereichs-Variable!" Zeile 413! und im Profanfenster steht ".....konnte nicht gepackt werden" Mit deinem Quellcode: Hier kommt nur die Meldung im Profanfenster ".....konnte nicht gepackt werden"
lg Bernhard |
|
|
| |
|
|
|
Frank Abbing | Sieht aus, als wäre dein Arbeitsspeicher zur Neige gagangen. Profan kann so viel Speicher nicht mehr reservieren. Das ist dann kein Programmfehler, daher keine Fehlermeldung, sondern ein Abbruch mit Information. Ich bin deswegen so pingelig, da ich einfach nur sicher stellen möchte, dass der Code fehlerfrei läuft. |
|
|
| |
|
|
| |
|
- Seite 2 - |
|
|
Bernhard Künzel | Hallo Frank, habe eine wav Datei erfolgreich mit über 38,2 MB gepackt daher kann es am Arbeitsspeicher nicht liegen. |
|
|
| |
|
|
|
Sebastian Sprenger | Ich hab die Ursache... Bernhards Dateien werden durch das Packen nicht kleiner, sondern größer und passen deshalb nicht in den Bereich, in dem Frank die Daten komprimieren lässt. Wenn ich die Bereiche um 399 Bytes größer anlege: funktionieren sie alle. Gruß, Sebastian |
|
|
| Profan² 7.0e, XProfan 9, 11.2a, FreeProfan32 Windows Vista Home Premium 32-Bit, 2.8 Ghz, 4 GB RAM Windows Me, 1.8 Ghz, 256 MB RAM | 13.09.2008 ▲ |
|
|
|
|
Frank Abbing | Ist bei mir nicht der Fall. Können die Daten nicht gepackt werden, "stoppt" die Routine rechtzeitig. Alles andere ist ja auch Quatsch. |
|
|
| |
|
|
|
Bernhard Künzel | Hallo Sebastian, du hast die richtige Ursache gefunden, durch deine Änderungen werden die Dateien jetzt gepackt, aber eben mit einem größeren Code als das Original.
Hallo Frank, es betrifft alle Dateien wo die Compression einen größeren Code erzeugt. der Fehlertext ist in deinem Quellcode (siehe oben) eingebaut Else Dispose bereich# Print text$+" konnte nicht gepackt werden." EndIf
Meine gesendeten Dateien können somit auch bei dir nicht funktionieren. Dein XProfan wird nicht einen größeren Bereich reservieren als bei mir. Es ist ja auch kein Fehler in deinem Code, denn wenn der gepackte Coder größer wird als das Original, ist es nicht sehr sinnvoll diesen zu packen. Aber die Fehlermeldung sollte dann lauten "keine Compression möglich" Was da alles Quatsch sein soll, verstehe ich wirklich nicht. |
|
|
| |
|
|
|
Frank Abbing | Der Packfunktion wird ja die Grösse der Daten übergeben. Wird der Wert überschritten, sollte die API die Compression stoppen, und bei mir tut sie das auch. Ich erhalte die Programm-Meldung, aber ohne einen Absturz. |
|
|
| |
|
|
|
Thomas Freier | Super! Und schnell. Damit brauch ich mir über die Verschlüsselung der Vereinsdaten keine Gedanken mehr machen. Die *.dbf Dateien waren wieder einsetzbar und die die Kompressionswerte lagen bei 70%. |
|
|
| |
|
|
|
Frank Abbing | Genau, Thomas. Ich werde mal "Verschlüsselung" mit in den Titel aufnehmen.
@Sebastian: Hab deine Änderungen in den Code eingebaut, die 400 Byte tun niemandem weh, wenn es dafür überall funktioniert. |
|
|
| |
|
|
|
E.T. | Mal ne Frage: was ist das eigentlich für ein Format, was da raus kommt. Können die Datein dann nur mit dieser Routine wieder entpackt werden ??
NACHTRAG: Kann ich damit auch einen ganzen Ordner sicher packen (Statt Dateiname ein Verzeichnis übergeben) ??
Ja.
Wenn du einen ganzen Ordner packen willst, musst du die Daten der einzelnen Files selber verwalten. Also dir ein eigenes Format dafür schaffen. |
|
|
| Grüße aus Sachsen... Mario WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte... | 15.12.2008 ▲ |
|
|
|
|
| Zu Erstens glaub ich "Ja", zu Zweitens glaub ich "Nein". |
|
|
| |
|
|