Hallo,
Das Ziel ist, dass ein großer Teil der CRTL beim Linken als überflüssig (nicht benutzt) erkannt wird und rausfällt - im Idealfall die komplette Runtime. Das ergibt kleinen, kompakten Code.
Erkennt dein Linker das?
da bin ich gerade nicht sicher; vermutlich nicht. Der Borland-Compiler bzw. -Linker, den ich ganz, ganz früher (so vor 20 Jahren) mal verwendet habe, konnte das bis auf Funktions-Ebene tracken und hat aus den angegebenen Bibliotheken (einschließlich CRTL) nur die Funktionen gelinkt, die auch referenziert wurden. Der gcc (als Teil der MinGW32-Toolchain in Code::Blocks) ist nicht ganz so schlau, meine ich.
Ich habe allerdings nur in einem von acht C-Modulen, aus denen das Projekt besteht, die stdio.h eingebunden, weil ich dort in einer Funktion noch eine Altlast in Form von fopen(), fwrite() und fclose() habe und bisher zu faul war, das auf CreateFile(), WriteFile() und CloseHandle() umzustellen.
Wenn ich da "saubermache", kann ich vermutlich komplett auf die CRTL verzichten.
Wird nicht vielmehr eine Referenz auf die msvcrt DLL gesetzt und die wird geladen? Oder gibt's auch heute noch ein auf obj-Ebene optimiertes, statisches Linken auf die Runtime Lib?
Irgendwo konnte ich das einstellen, ich find's jetzt aber auf die Schnelle nicht.
Vor allem: Ist das relevant? Läufst Du derart hart am Speicherlimit, dass Du Dir das nicht erlauben kannst?
Nein. Das ist ein seit über 30 Jahren tief verwurzelter Ehrgeiz. Ich habe das Programmieren auf einem C64 in Assembler begonnen, da zählte noch jedes Byte!
Der zweite Punkt ist, dass API Funktionen auch mal verschimmeln. Wie z.B. GlobalAlloc. Eine CRT Lib kapselt das.
Nun, da gehe ich mal davon aus, dass Betriebssystemkomponenten in sehr viel kürzeren Intervallen aktualisiert werden als Compiler und deren Bibliotheken.
Es scheitert immer daran, dass ich zuerst "meine eigene" Prozess-ID herausfinden muss, über deren Herkunft die API-Dokumentation den Mantel des Schweigens deckt.
Dann fragt man halt einen, der es weiß. Quack! Bei mir ist's der erste Treffer.
Google und auch die Microsoft-Suche haben mir zu ähnlichen Anfragen nur die große Keule der Process API um die Ohren gehauen, aber nichts Spezifisches.
Falls bei Dir nicht: hier.
Danke! Damit kann man doch arbeiten!
De facto ist GetCurrentProcess ein Einzeiler:
return (HANDLE)-1;
. Aber man soll die Funktion trotzdem verwenden, falls MS das irgendwann mal ändern wird (werden sie nicht können, es wird zu viele Deppen geben, die die -1 hardcoded haben).
Fürchte ich auch. So wie irgendwann als "undocumented feature" durchsickerte, dass das Window-Handle 0 den Desktop repräsentiert, was die Funktion GetDesktopWindow() de facto überflüssig machte. Ich meine, das wurde später sogar mal in die Doku aufgenommen. Wie du sagst: Zu viele haben es schon verwendet, da wollte man das Feature nicht mehr zurückziehen.
Oh Mann. Ich mach seit über 20 Jahren .net und fasse das WinAPI höchtens mit einer Kneifzange an. Und dann so ein Thema 😂
Ich bevorzuge diese Methode. Der Einarbeitungsaufwand und der Overhead anderer Bibliotheken oder Frameworks war mir bisher einfach zu groß. Das Windows-API ist dagegen gut dokumentiert und relativ straightforward (wenn man das mit der Fenster-Organisation und den Messages mal verstanden hat).
Live long and pros healthy,
Martin
Fische, die bellen, beißen nicht.