| |
|
|
Frank Abbing | données saisir sans Dll, seulement mittels API.
================================================================================
================================================================================/
données saisir/entpacken sans Dll, seulement 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 saisir. paramètre: (Speicherbereich, Anzahl Bytes im Speicherbereich)
Proc CompressBuffer
Paramètres bbereich#, cbx&
Déclarer cstatus&, bworkspacesize&, fworkspacesize&, cbereich#, workspace#
cstatus&=0
Si non RtlGetCompressionWorkSpaceSize(2, Addr(bworkspacesize&), Addr(fworkspacesize&))
Faible workspace#,bworkspacesize&
Faible cbereich#,cbx&+400
Si non RtlCompressBuffer(2,bbereich#,cbx&,cbereich#,cbx&+400,0,Addr(bworkspacesize&),workspace#)
Claire bbereich#
Long bbereich#,0=cbx&
RtlMoveMemory(bbereich#+4,cbereich#,bworkspacesize&)
cstatus&=bworkspacesize&+4
EndIf
Dispose workspace#
Dispose cbereich#
Endif
Retour cstatus&
Rückgabe: Anzahl qui gepackten Bytes. qui gepackten données wurden dans den übergebenen Speicherbereich kopiert.
ENDPROC
Originale Speichergrösse ermitteln. paramètre: (gepackter Speicherbereich#)
Proc GetDecompressSize
Paramètres bbereich#
Retour Long(bbereich#,0)
ENDPROC
Speicherbereich entpacken. paramètre: (gepackter Speicherbereich, Anzahl Bytes im gepackten Speicherbereich, freier Speicherbereich)
Proc DecompressBuffer
Paramètres bbereich#, cbx&, cbereich#
Déclarer bworkspacesize&
Si non RtlDecompressBuffer(2,cbereich#,Long(bbereich#,0),bbereich#+4,cbx&-4,Addr(bworkspacesize&))
Retour bworkspacesize&
EndIf
Retour 0
Rückgabe: Anzahl qui entgepackten Bytes.
ENDPROC
================================================================================
================================================================================/
====> HAUPTPROGRAMM
Déclarer bereich#, bereich2#, text$, x&, xcopy&, newbytes&
Cls
Tandis que 1
text$=LoadFile$("Datei zum saisir aussuchen",»)
Si text$<>»
saisir testen
x&=FileSize(text$)
xcopy&=x&
Si x&
Faible bereich#, x&+400
BlockRead(text$, bereich#, 0, x&)
newbytes&=CompressBuffer(bereich#, x&)
Si newbytes&
Set("Décimal",2)
Imprimer "Dateiname: "+text$
Imprimer "Originalgrösse liegt chez "+Str$(x&)+" Bytes, comprimiert chez "+Str$(newbytes&)+" Bytes."
Imprimer "Packrate liegt chez "+Str$(100-(newbytes&*100/x&))+" Prozent."
text$=text$+".pck"
BlockWrite text$, bereich#, 0, newbytes&
Dispose bereich#
Entpacken testen
x&=FileSize(text$)
Si x&
Faible bereich#, x&
BlockRead(text$, bereich#, 0, x&)
newbytes&=GetDecompressSize(bereich#)
Faible bereich2#,newbytes&
x&=DecompressBuffer(bereich#, x&, bereich2#)
Si x&
text$=text$+".org"
BlockWrite text$, bereich2#, 0, x&
Imprimer "Dateiname: "+text$
Imprimer "Decomprimierte Originalgrösse beträgt "+Str$(x&)+" Bytes."
Imprimer
D'autre
Imprimer text$+" konnte pas entpackt volonté."
Imprimer
EndIf
Dispose bereich2#
Dispose bereich#
EndIf
D'autre
Dispose bereich#
Imprimer text$+" konnte pas être emballés."
EndIf
EndIf
D'autre
BREAK
EndIf
Endwhile
WaitInput
Fin
|
|
|
| |
|
|
|
| |
|
| |
|
|
|
Frank Abbing | Nachtrag: Gibt on comme ersten paramètre chez RtlCompressBuffer() et RtlDecomressBuffer() anstelle qui 2 une $102 à, ensuite erreicht on une höhere Packrate. Allerdings sur coûter qui Geschwindigkeit. |
|
|
| |
|
|
|
| comment pourrait on am besten sûrement vérifier, si cet Funktion sur dem System aussi bereitsteht? avec XProfan ImportDLL pour Funktion chercher, si le DLL existert? |
|
|
| |
|
|
|
Frank Abbing | APIs LoadLibrary() et ensuite GetProcAddress(). So mach ego dans Assembler. Hatte es ici pas gemacht, weil es aussi so chez mir bien funktionierte. Pour cette volonté sous 98 qui Funktionen pas trouvé, au cours de vous dans meiner Assemblerversion très wohl trouvé volonté. mais mir scheint, là existieren vous zwar, avons mais aucun Auswirkungen. Ab XP (Start qui Documentation) sommes qui NTDLL.DLL-Funktionen mais sûrement vorhanden, tout autor empfehle je plutôt une Betriebssystem-Test. |
|
|
| |
|
|
|
Jac de Lad | une typische Frank-Genialität. |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 05.09.2008 ▲ |
|
|
|
|
Michael Wodrich | oui, là schliesse je mich à... |
|
|
| Programmieren, das spannendste Detektivspiel der Welt. | 06.09.2008 ▲ |
|
|
|
|
Frank Abbing | |
|
| |
|
|
|
Bernhard Künzel | Habe avec qui Compress.exe getestet, wobei chez manchen Grafiken une Fehlermeldung erscheint. trop wenig grenier pour Bereichs-Variable! la ligne 413! Im Anhang sommes 4 Grafiken, wohin cet Fehlermeldung erscheint. |
|
|
| |
|
|
|
Frank Abbing | quelle Version Windows (s'il te plaît dans qui Signatur angeben )? Huh, la ligne 413? Soviel Zeilen hat qui Code oui chez Weitem pas. là qui Source beigelegt ist, peux du volontiers qui Ursache erforschen. mon Tests verliefen alle correct. |
|
|
| |
|
|
|
Bernhard Künzel | allô Frank, Win Version XP Home SP2 Profan Version XProfan11ßRC9 Test avec deiner Compress.exe: dans qui MessageBox venez qui Fehlermeldung "Zu wenig grenier pour Bereichs-Variable!" la ligne 413! et im Profanfenster steht ".....konnte pas emballé werden" avec deinem Quellcode: ici venez seulement qui annonce im Profanfenster ".....konnte pas emballé werden"
lg Bernhard |
|
|
| |
|
|
|
Frank Abbing | Sieht aus, comme wäre dein Arbeitsspeicher zur Neige gagangen. Profan peux so viel grenier pas plus reservieren. c'est ensuite ne...aucune Bug, daher aucun Fehlermeldung, mais un Abbruch avec information. je suis deswegen so pingelig, là je simple seulement sûrement se mettre voudrais, dass qui Code correct fonctionne. |
|
|
| |
|
|