Funktionen aus DLL laden?
-
Hi,
wie kann ich folgende Funktionen als welchen DLLs dynamisch laden?
-RegisterClassEx
-MessageBox
-CreateWindowEx
-ShowWindow
-UpdateWindow
-IsIconic
-PeekMessage
-GetMessage
-TranslateMessage
-DispatchMessage
-AdjustWindowRectEx
-MoveWindow
-GetSystemMetricsGrund ist, ich möchte meine exe so klein wie möglich machen und da ist jede fehlende statische lib einer dynamischen vorzuziehen.
Weiß einer wie ich das mache?
-
Das bringt nix.
-
******** schrieb:
Das bringt nix.
Warum?
-
das bringt wirklich nicht viel, denn die libs werden auch bei "normaler" benutzung nicht komplett eingelinkt, sondern nur die einsprungpunkte. Das dynamische Laden der DLLs hat soweit es mir im Moment einfällt nur den Vorteil dass man bei eigener Software z.B die DLLs Updaten kann ohne dass das Hauptprogramm rumzickt (Fehlernder einsprungspunkt blabla).Und dass man im Programm noch darauf reagieren kann wenn eine DLL fehlt (eventuell Meldung ausgeben und weitermachen - bei statischer Verlinkung führt Windows die Exe nicht weiter aus)
EDIT: ok, die Antwort:
Die WinAPIS
LoadLibrary
GetProcAdress
FreeLibrary
bringen dich weiter
-
Hmn dreck, dabei dachte ich, ich würde so noch tiefer kommen als 6 KByte... shit...
-
Also imho kann man noch einiges aus dem Compiler & Linker rausholen:
Je nach Linker gibts so eine funktion:
/MERGE:.rdata=.text
und die größe der einzelnen Blöcke(k.A. mehr wie es richtig heißt) in der EXE (minimal 512 Bytes) kann man im Linker beeinflüssen.
Also ich kann dir eine 1KB Win32 Exe schicken
-
Diese Linkereinstellung habe ich schon
-
Dann heist das Zauberwort: EXE packer.
FSG packer ist freeware und richtig gut bei asm und cpp stuff. Einfach mal testen, das kommt man auch unter 1kb w32 exe

-
Schau mal auf meine Webseite unter Dll
http://members.inode.at/anton.zechner/az/index.html
PS: MessageBox gibt es nicht, sondern nur MessageBoxA bzw. MessageBoxW für Unicode !!!
-
Dann heist das Zauberwort: EXE packer.
FSG packer ist freeware und richtig gut bei asm und cpp stuff. Einfach mal testen, das kommt man auch unter 1kb w32 exe
Packer bringen bei 6KB-EXE nichts mehr - irgendwo müssen die ja auch ihre Entpackroutine installieren und die belegt mehr als so ein Packer wieder wett machen kann.Übrigens ist die 1-KB Exe nicht gepackt, enthält aber nur eine "bin eine kleine EXE" Meldung. Man könnte rein theoretisch noch etwas mehr rausholen wenn man am PE Header rumwurstelt, es ist dann aber nicht mehr gewährleistet dass die EXE auf jedem 32-bit windows läuft.
http://217.160.247.193/index.php?topic=14782.0
http://217.160.247.193/index.php?topic=3402.0
-
Ich wette mit FSG holst du noch was raus, schau ich hab den test gemacht:
#include <small.h> //linker setup #include <windows.h> int main() { MessageBox(0, "kleine anwendung", "test", 0); return 0; }Ungepackte EXE: 1024 bytes
Mit FSG gepackt: 733 bytes :: und immer noch ausführbar ohne probleme
-
Hi,
gibt es irgendwo eine Liste über alle Möglichkeiten eine TinyExe zu erstellen? Meine ist im Releasemodus mit aktivierten optimierung leider 250 KB groß

-
-
th1rte3n schrieb:
Ich wette mit FSG holst du noch was raus, schau ich hab den test gemacht:
#include <small.h> //linker setup #include <windows.h> int main() { MessageBox(0, "kleine anwendung", "test", 0); return 0; }Ungepackte EXE: 1024 bytes
Mit FSG gepackt: 733 bytes :: und immer noch ausführbar ohne problemewas issn <small.h>? Die hab ich in meinem VC++7 nicht?
-
Ja, hab ich als header datei im include ordner hinzugefügt, hier der code:
small.h
#pragma comment(linker,"/ENTRY:main") #pragma comment(linker,"/MERGE:.rdata=.data") #pragma comment(linker,"/MERGE:.text=.data") #pragma comment(lib,"msvcrt.lib") #if (_MSC_VER < 1300) #pragma comment(linker,"/IGNORE:4078") #pragma comment(linker,"/OPT:NOWIN98") #endif #define WIN32_LEAN_AND_MEAN
-
Frage, wenn ich eine Win32-Application erstelle und
das hier:
#pragma comment(linker,"/ENTRY:main")durch
#pragma comment(linker,"/ENTRY:WinMain")ersetze erscheint das Programmfenster nicht?

Was mach ich falsch?
-
Das brauchst du doch nicht zu ändern, weil es schon standart ist WinMain()
Einfach rausnehmen und wie gehabt WinMain verwenden...