Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi RtlCompressBuffer alternative gesucht! (https://www.delphipraxis.net/194897-rtlcompressbuffer-alternative-gesucht.html)

Fukiszo 17. Jan 2018 10:28

RtlCompressBuffer alternative gesucht!
 
Hallo, ich nutze in einem meiner projekte die RtlCompressBuffer funktion um, wie der name bereits vermuten lässt, etwas zu komprimieren.
Nun bin ich über die WMI CompressFile funktion gestolpert die bei NTFS dateisystem per windows daten schrumpfen lässt.

Delphi-Quellcode:
function CompressFile(const FileName:string):integer;var FSWbemLocator : OLEVariant; FWMIService  : OLEVariant; FWbemObject  : OLEVariant;begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService  := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', ''); FWbemObject  := FWMIService.Get(Format('CIM_DataFile.Name="%s"',[StringReplace(FileName,'\','\\',[rfReplaceAll])])); Result:=FWbemObject.Compress();
aber diese funktion gilt ja nur für NTFS und eine datei als ganzes.

Jetzt frag ich mich, weil ja RtlCompressBuffer eine undokumentierte und möglicherweise nicht in jeder windows version zur verfügung stehende funktion ist, ob es eine legitime funktion gibt, die wie RtlCompressBuffer arbeitet (im speicher)
mit der man "On-The-Fly" etwas komprimieren kann damit ich ein "legitimes" produkt habe.

hier meine deklarationen mit "RtlCompressBuffer" damit ihr nachvollziehen wie ich es aufrufe:

Delphi-Quellcode:
function RtlGetCompressionWorkSpaceSize(CompressionFormatAndEngine: ULONG; CompressBufferWorkSpaceSize, CompressFragmentWorkSpaceSize : PULONG): NTSTATUS; stdcall;
function RtlCompressBuffer(CompressionFormatAndEngine:ULONG; SourceBuffer: PVOID; SourceBufferLength: ULONG; DestinationBuffer: PVOID; DestinationBufferLength: ULONG; SourceChunkSize: ULONG; pDestinationSize: PULONG; WorkspaceBuffer: PVOID):NTSTATUS; stdcall;
function RtlDeCompressBuffer(CompressionFormatAndEngine:ULONG; DestinationBuffer: PVOID; DestinationBufferLength: ULONG; SourceBuffer: PVOID; SourceBufferLength: ULONG; pDestinationSize: PULONG):NTSTATUS; stdcall;

implementation

const ntdll = 'ntdll.dll';

function RtlGetCompressionWorkSpaceSize; external ntdll name 'RtlGetCompressionWorkSpaceSize';
function RtlCompressBuffer; external ntdll name 'RtlCompressBuffer';
function RtlDeCompressBuffer; external ntdll name 'RtlDecompressBuffer';
im wesentlichen ging es mir darum eine leichte kompression zu erzielen die keinerlei Third-Party software einsetzt.
alles sollte mit windows bordmitteln per WinAPI schaffbar sein...
kompression muss weder stark noch "knackfest" sein, sie soll lediglich einen ersten blick in eine datei abfälschen.
es geht hier um geschwindigkeit und woran ich halt jetzt grad grübel, kompatibilität zu windows.

im DP hab ich bis jetzt noch nicht viel brauchbare infos dazu gefunden aber der eine oder andere hat mit sicherheit einen guten rat für mich parat, oder? ;-)

Besten Dank für's lesen und hoffentlich auch beantworten hehe

ps: nutzt nicht meine dargestellten funktionen in eurem code, sie sind bestimmt böse weshalb ich dieses Thema schrieb.

Neutral General 17. Jan 2018 10:34

AW: RtlCompressBuffer alternative gesucht!
 
Habe das hier gefunden:

https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Scheint aber erst ab Windows 8 zu funktionieren.

Fukiszo 17. Jan 2018 10:53

AW: RtlCompressBuffer alternative gesucht!
 
der link ist klasse von dir, aber wie bereits von dir vermutet nicht generell windows(NT) kompatibel,
da würd ich das eine übel gegen ein anderes tauschen.
mein produkt muss leider auch mit XP funktionieren, was es ja momentan auch macht, mich stört halt der umstand das es eine undokumentierte funktion ist die jederzeit obsolet werden könnte und mit windows update XYZ weg sein könnte.

Besten Dank!

generic 17. Jan 2018 13:13

AW: RtlCompressBuffer alternative gesucht!
 
Wieso ist die undokumentiert?

https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Bernhard Geyer 17. Jan 2018 13:17

AW: RtlCompressBuffer alternative gesucht!
 
Und was steht dort:

Version
Available starting in Windows XP.

generic 17. Jan 2018 13:25

AW: RtlCompressBuffer alternative gesucht!
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1391220)
Und was steht dort:

Version
Available starting in Windows XP.

Ich verstehe euch heute nicht :-( Ich glaub ich brauch mehr schlaf.

Zitat:

Jetzt frag ich mich, weil ja RtlCompressBuffer eine undokumentierte und möglicherweise nicht in jeder windows version zur verfügung stehende funktion ist
Also Funktion ist dokumentiert!

Zitat:

...mein produkt muss leider auch mit XP funktionieren...
Funktion ist in XP verfügbar.

Ist das nicht das, was Fukiszo wollte?

Bernhard Geyer 17. Jan 2018 13:29

AW: RtlCompressBuffer alternative gesucht!
 
Zitat:

Zitat von generic (Beitrag 1391221)
Ich verstehe euch heute nicht :-( Ich glaub ich brauch mehr schlaf.

...

Ist das nicht das, was Fukiszo wollte?

Genau. War ja auch für Fukiszo gedacht.
Du brauchst wirklich mehr schlaf :stupid:

himitsu 17. Jan 2018 13:37

AW: RtlCompressBuffer alternative gesucht!
 
Er hatte ja selber behauptet es sei nicht dokumentiert. :stupid:

OK, abgesehn, dass diese Funktion eigentlich für das Windows Driver Kit gedacht ist, also z.B. für die Verwendung in Treibern und nicht direkt für User-Mode-Programme, ist sonst alles OK.

Natürlich könnte auch jemand noch fragen warum es unbedingt diese Komprimierungsfunktion sein muß und nicht Eine der vielen Anderen, oder gar die ZLib, welche direkt im Delphi vorhanden ist, und das schon seit mehreren Jahrzehnten.

Fukiszo 17. Jan 2018 13:53

AW: RtlCompressBuffer alternative gesucht!
 
mit undokumentiert meinte ich, diese funktion ist nicht in delphi (version 7) nativ vorhanden und kennt auch keine hilfestellung zu diesem thema.
meine version der Win32.hlp datei schweigt sich darüber auch aus.
da die überschrift "alternative" heisst hoffte ich es gibt noch mehr funktionen die ab WindowsXP per WinAPI so etwas machen könnten und ich lediglich zu doof war sie zu entdecken.
zLib apLib ucl flexcompress 7zip und der gleichen wollte ich nicht wirklich einbinden, wobei mir zlib noch am liebsten ist wegen geschwindigkeit.

Vielen Dank für Euren feedback!

himitsu 17. Jan 2018 14:17

AW: RtlCompressBuffer alternative gesucht!
 
Das kann Delphi 7 auch garnicht kennen.
1995 Delphi 7
2001 Windows XP

Außerdem sind nur ein paar WinAPIs im Delphi enthalten. Niemand hatte Lust sämtliche APIs nach Pascal zu übersetzen,
also gibt es nur die "Wichtigsten", vorallem Win32-API, GDI, COM/ActiveX usw.
Das WinDDK in Pascal gibt es aber von einigen Drittanbietern.

Wenn man mit C++ oder C++Builder arbeitet, dann kann man natürlich auch direkt gegen die API-Header des WinDDK kompilieren und braucht keine Headerübersetzungen zu suchen oder selber anzufertigen.

Fukiszo 17. Jan 2018 16:44

AW: RtlCompressBuffer alternative gesucht!
 
Zitat:

Zitat von himitsu (Beitrag 1391225)
...und nicht Eine der vielen Anderen...

genau das versuch ich ja herauszufinden (siehe Titel -> "alternative")
wenn du mir bitte mit Api's weiterhelfen könntest, das wäre super!
"Eine der vielen" klingt klasse, bitte unterweise mich.

sollte halt eine funktion sein die XP versteht und auch aktuelle OS.

wenn da so viele vorhanden sind, könnt ich ja mein produkt auf verschiedene engines umrüsten.

himitsu besten dank schonmal!

alle anderen können sich gern mit-einklinken und mir weitere buffercompressions funktionen vorstellen,
je mehr je besser, haltet euch nicht zurück, egal ob code ur-alt ist oder erst in XE10 vorgestellt wurde.
Für mich gibt es kein "richtig/falsch" in diesem zusammenhang solange XP damit klar kommt bin ich total happy!

Es grüßt

Der schöne Günther 17. Jan 2018 17:14

AW: RtlCompressBuffer alternative gesucht!
 
Wenn du einfach nur "irgendwas komprimieren" möchtest hat mir persönlich immer die mitgelieferte Unit
Delphi-Quellcode:
System.Zip
gereicht. Handelsübliche ZIP-Kompression in Dateien oder in den Speicher, Dateien rein und raus, alles ganz einfach.

Beispiel:

Delphi-Quellcode:
interface uses
   System.Classes,
   System.SysUtils,
   System.Zip,
   System.IoUtils;

procedure compressStuff();
const
   exampleData: TBytes = [1,2,3];
var
   inputStream: TStream;
   zipFile: TZipFile;
   outputStream: TBytesStream;
begin
   inputStream := nil; zipFile := nil; outputStream := nil;
   try
      inputStream := TBytesStream.Create(exampleData);
      outputStream := TBytesStream.Create();

      zipFile := TZipFile.Create();
      zipFile.Open(outputStream, TZipMode.zmWrite);
      zipFile.Add(inputStream, 'compressedInput.dat');

      TFile.WriteAllBytes('x:\myZipfile.zip', outputStream.Bytes);
   finally
      inputStream.Free(); zipFile.Free(); outputStream.Free();
   end;
end;

himitsu 17. Jan 2018 17:20

AW: RtlCompressBuffer alternative gesucht!
 
Sonst kenn ich keine API im Windows.

ZLib ist im Delphi enthalten (gleichnamige Unit).
Das ist eine Wörterbuchkomprimierung mit anschließender Entropiekodierung. (wird z.B. in ZIP- und GZ/GZIP-Dateien verwendet oder bei der komprimierten Übertragung von HTTP-Servern)
http://docwiki.embarcadero.com/Libra...en/System.ZLib
https://de.wikipedia.org/wiki/Zlib

Hier im Forum suchenZipMaster / Bei Google suchenZipMaster
Bei Google suchenAbbrevia
ZipForge, FlexCompress, KaZip, UnRAR, SynZip, ....
und sogar in der JCL verstecken sich einige Komprimierungsfunktionen.

TZipFile ist neu und gibt es in Delphi 7 noch nicht, aber nutzt ja intern auch wieder die ZLib.
Wobei ZipFile natürlich nicht nur die Kompimierung, sondern auch das ganze Management/Overhead zur Behandlung von mehreren verschlüsselten Datenstreams in einer ZIP-Datei hat.

7-Zip ist offen. Das kann als DLL genutzt oder via vorkompilierter OBJ direkt in die EXE gelinkt werden.
(OBJ: siehe ZLip, TJPEGImage, TRegEx ... das kommt alles von Fremden und wird im Delphi nur wiederverwendet)
www.7-zip.de/sdk.html

LeseTipp: http://www.delphipraxis.net/152933-k...-geht-das.html

Fukiszo 17. Jan 2018 22:52

AW: RtlCompressBuffer alternative gesucht!
 
Ah schade, nach der vorfreude "die vielen anderen" nun die ernüchterung.
Na wenn RtlCompressBuffer eh die einzige schnittstelle für puffer kompression mit windowsXP per WinAPI ist,
kann ich ja dennoch stolz auf mich sein das ich sie fand, auch wenn die eigentliche funktion für einen anderen zweck erdacht/bereitgestellt wurde.

ps:
wen es interessiert, mein produkt bearbeitet eine selfmade datenbank auf nicht konventionelle art und weise,
bei mir fangen die datensätze mit einem nicht-komprimierten DIB/BMP an,
da es immer die gleiche dimension hat (ist gleichzustellen mit einer festen offset position/kleines thumbnail)
fängt der eigentliche inhalt erst danach strukturiert an,
bei anzeige/bearbeitung eines datensatzen, wird der per LZMA dekomprimierung in den speicher geladen.
im speicher wiederum geht eine on-the-fly komprimierung vor sich damit der speicher nicht zu voll wird.
nur partielle bereiche sind kurzzeitig komplett entpackt im speicher.
nach bearbeitung wird der komplette datensatz erstmal nur auf hdd ausgelagert (auch on-the-fly komprimiert) bis das programm entweder den befehl erhält, eine bestimmte uhrzeit ist, das system gebootet wird oder zu guter letzt eine gewisse system inaktivität festgestellt wird, dann wird das bearbeite wieder per LZMA in die hauptdatenbank eingepflegt.
in den datensätzen selbst ist meist ellenlanger TEXT/RTF/HTML/PDF inhalt mit ein paar bilder oder video's.
Es funktioniert ja auch alles tadellos, aber da schon ewig meinerseits keine echten erneuerungen damit gemacht wurden (letztes update ersetzte LZSS mit LZMA), dacht ich mir ich widme mich mal dem thema "on-the-fly" und ob profi's mir eine andere schnittstelle die microsoft zur verfügung stellt verraten könnten. (zu dem zeitpunkt der erschaffung gab es auch im MSDN wenig bis garnichts über diese funktion zu lesen, damals hieß es noch "function will be used intern").
Ich geb zu ich war seit ewigkeiten nicht mehr im MSDN und mir fielen da glatt die augen raus als ich eure links verfolgte. Ich bin ja ein liebhaber von WinAPI und was da so alles ans tageslich kommt.... mann-o-mann, find ich echt klasse das MS einen derart weiterhilft, sorry offtopic aber ich kanns immernoch kaum glauben.
als ich kurzzeitig mal einen abstecher in die welt von VB machte war MSDN unerläßlich aber sobald ich da mal was mit delphi oder asm fragte wurd ich immer wieder enttäuscht.

In diesem Sinne, danke für eure meinungen auch wenn mir selbst nicht wirklich weitergeholfen werden konnte, danke danke dankeschön!

TiGü 18. Jan 2018 09:20

AW: RtlCompressBuffer alternative gesucht!
 
Zitat:

Zitat von Fukiszo (Beitrag 1391245)
Ah schade, nach der vorfreude "die vielen anderen" nun die ernüchterung.
Na wenn RtlCompressBuffer eh die einzige schnittstelle für puffer kompression mit windowsXP per WinAPI ist,
kann ich ja dennoch stolz auf mich sein das ich sie fand, auch wenn die eigentliche funktion für einen anderen zweck erdacht/bereitgestellt wurde.

Na ja, die Einschränkung, dass es schon ab XP laufen soll, nur von der WINAPI kommen soll und du anscheinend keine Dritt-Sachen verwenden willst (ZLIB), macht die Sache nicht einfach.

Ab Window 8 aufwärts könnte man sonst bspw. die Compress API nehmen:
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Neutral General 18. Jan 2018 10:02

AW: RtlCompressBuffer alternative gesucht!
 
Zitat:

Zitat von TiGü (Beitrag 1391271)
Ab Window 8 aufwärts könnte man sonst bspw. die Compress API nehmen:
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Siehe die erste Antwort im Thread :duck:

Fukiszo 18. Jan 2018 10:52

AW: RtlCompressBuffer alternative gesucht!
 
Ja leider, 7 Klients laufen noch unter WindowsXP
und ich hab den Windows8 Api befehl bereits beherzigt und mein produkt dementsprechend vorbereitet.
Waren ja nur ein paar mikroskopisch kleine Eingriffe nötig.

#nachtrag zu meiner letzten Nachricht
"auch wenn mir nicht geholfen werden konnte" war bereits beim absenden doppelt revidiert. SORRY!
1. Es hat mir geholfen zu erfahren das WindowsXP keine weitere schnittstelle bietet, DANKE!
2. Ich scheine ja, was ich erreichen wollte, erfüllt zu haben ohne das es mir bewusst war, DANKE!

Da ich bereits eine Leistungsfähige LZMA komprimierung einsetze benötige ich keine weitere 3rd-Party oder Units, aber danke.
Die mini-komprimierung vom RtlCompressBuffer reicht da mehr als aus da hauptsächlich nur "Text" kodiert wird.
In einem 10MB Text dokument macht diese funktion ca. 6MB daten daraus, in windeseile. (per LZMA meist nochmal grob -50%)
Siehe Beschreibung wie ich den RtlCompressBuffer nutze, on-the-fly. Es geht rasend schnell hin und her.

TiGü 18. Jan 2018 12:01

AW: RtlCompressBuffer alternative gesucht!
 
Zitat:

Zitat von Neutral General (Beitrag 1391277)
Zitat:

Zitat von TiGü (Beitrag 1391271)
Ab Window 8 aufwärts könnte man sonst bspw. die Compress API nehmen:
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Siehe die erste Antwort im Thread :duck:

:thumb:
Ich klick auch nicht jeden Kram an.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:31 Uhr.

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