Entwickler-Ecke
Windows API - Kleinstmögliche EXE?
Aya - Sa 04.06.05 21:12
Titel: Kleinstmögliche EXE?
Hi,
ich bastle grad an einer 64k Demo rum und hab da ein mehr oder weniger großes problem *g*
Der reine Code zum Fenster erstellen schluckt 8.5kb der EXE Datei... geht das mit Delphi noch irgendwie kleiner???
Denn das ist mir dann doch noch etwas zu groß.. und möglich muß es sein, denn es gibt viele Fenster-Programme die kleiner als 4kb sind.
(Mein OpenGL kram den ich bisher drin hab verbraucht grad mal 4kb und das sind schon knapp 100.000 Vertices mit Texturen... *g*)
Hier mal mein Code für's Fenster erstellen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75:
| program Project1;
uses K64Windows, K64Messages;
const ClassName = 'K64'; AppName = 'Koshigaya Studios - 64k Demo';
var Handle: hWnd; Go: Array[0..255] of Boolean; WindowWidth: Integer = 1280; WindowHeight: Integer = 960;
function WndProc(hWnd: HWND; message: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin Result:=0; Case message of WM_CREATE: begin
end; WM_DESTROY, WM_CLOSE: begin PostQuitMessage(0); end; WM_KEYDOWN: begin Go[wParam]:=true; end; WM_KEYUP: begin Go[wParam]:=false; end; WM_SIZE: begin
end; else begin Result:=DefWindowProc(hWnd,message,wParam,lParam); exit; end; end; end;
var wc: TWndClassEx = ( cbSize : SizeOf(TWndClassEx); Style : CS_HREDRAW or CS_VREDRAW; lpfnWndProc : @WndProc; cbClsExtra : 0; cbWndExtra : 0; hbrBackground : COLOR_APPWORKSPACE; lpszMenuName : nil; lpszClassName : ClassName; hIconSm : 0; ); msg: TMSG; done: Boolean = false; begin wc.hInstance := hInstance; wc.hIcon := LoadIcon(0,IDI_APPLICATION); wc.hCursor := LoadCursor(0,IDC_ARROW); RegisterClassEx(wc); Handle:=CreateWindowEx(0,ClassName,AppName,WS_CAPTION or WS_VISIBLE or WS_SYSMENU or WS_MINIMIZEBOX or WS_MAXIMIZEBOX or WS_SIZEBOX,Integer(CW_USEDEFAULT),Integer(CW_USEDEFAULT),WindowWidth,WindowHeight,0,0,hInstance,nil); ShowWindow(Handle,SW_MAXIMIZE); while not done do begin if (PeekMessage(msg,0,0,0,PM_REMOVE)) then begin if msg.message=WM_QUIT then begin done:=true; end else begin TranslateMessage(msg); DispatchMessage(msg); end; end; end; end. |
Wie ihr steht hab ich bei den Uses schon eigene Units gemacht... in der K64Messages und K64Windows ist nurnoch das drin was wirklich benötigt wird (beide nurnoch ca. 30-40 Zeilen).
Ich hab auch nirgendwo noch ne andere Unit eingebunden.
Und jetzt kann mir hoffentlich einer von den NonVCL'lern sagen wie ich es noch kleiner bekomme ;)
Au'revoir,
Aya~
PS: Mit ExePacker wird's von 8.5 auf 5.5kb gepackt.. immernoch zuviel ;)
3rdnuss - Sa 04.06.05 21:36
Wo hast du denn da Cursor gefunden? Ich hab das gerade auch mit dem ResHacker und anderen Programmen wie ExeScope versucht. Aber ich hab da nix rauslöschbares gefunden?
Aber ich denke nicht, dass man das Prorgramm viel kleiner bekommt.
Also bei Luckies Beispielen (irgendwo auf seiner HP) sind die Programme auch nicht kleiner.
JayEff - Sa 04.06.05 21:44
das prog klappt nur bei delphi programmen soweit ich weis.
raziel - So 05.06.05 06:09
Selbst mit Assembler kommst du bei einigen Assembler/Linker Gespannen nicht unter 4kB. Knapp über 1kB geht schon alleine für die Header drauf. Es würde kleiner gehen, aber nur mit viel Mühe+Hexeditor+Genaueres Studium der PE-Exe-Header. ;)
hansa - So 05.06.05 06:52
Was soll denn der Zweck solcher Aktionen sein ? :shock: Wem nützt denn heutzutage eine Festplatten-Ersparniss von 10 KB ?? Die deutsche Bank würde zurecht sagen, das wären Peanuts um die sich keiner kümmern wird. :mrgreen:
mimi - So 05.06.05 07:29
ganz einfach: Es gibt ganze demo sezne die mit 64 KB rum spielen und toll sachen damit schaffen, es ist eine Sport art wenn man so möchte, es gibt viele messen und veranstalltungen zu diesem thema...
@Aya ist ist möglich ich habe mal irgenwo beispiele gesehen asm+winapi und da waren die exe dateien kleiner als 4 KB, ich weiß leider nicht mehr wo, ich habe die demos aber gesichert ich werde mal in der nächsten woche danach suchen(sobalt ich zuhause bin)
Es ist aber schon toll: das ein normales delphi progamm über 300 KB verbraucht und die WinApi gerade mal 7-8 KB verbraucht(bzw. die KOL kompos)
matze - So 05.06.05 10:28
die leute aus der demo szene nehmen dann noch am shcluss eine modifizierte UPX Version her um das ding zu packen !
Aya - So 05.06.05 10:31
Hi,
matze hat folgendes geschrieben: |
| die leute aus der demo szene nehmen dann noch am shcluss eine modifizierte UPX Version her um das ding zu packen ! |
jap.. aber wie gesagt bekomme ich damit das ganze auch nur auf 5.5kb klein gepackt.. :(
Au'revoir,
Aya~
tommie-lie - So 05.06.05 11:33
Hast du Nicos system.pas und sysinit.pas schon drin (
http://www.bendlins.de/nico/delphi/MiniDExe.zip)? Allerdings darfst du dann auf Compiler-Magic und damit auch auf Objektorientierung verzichten, aber immerhin kriegt er seine Echsen auf viereinhalb kB.
Aya - So 05.06.05 11:38
Hi,
hab es auf andere art und weise hinbekommen.. :)
Wenn man Windows vorgaukelt es sein eine COM Datei und das dann mit UPX packt etc wird die exe im endeffekt knapp 2kb groß... :)
(Hab eine system.pas von "Vladimir Kladov" benutzt)
Danke trotzdem für eure hilfe :)
Au'revoir,
Aya~
Delete - Mo 13.06.05 10:50
Und das funktioniert auf Windows 9x? Sollte eigentlich nicht, da das File-Alignment dort einen Wert von 0x1000 haben muß.
retnyg - Mo 13.06.05 11:57
STATUS_ACCESS_DENIED hat folgendes geschrieben: |
| Und das funktioniert auf Windows 9x? Sollte eigentlich nicht, da das File-Alignment dort einen Wert von 0x1000 haben muß. |
bei com-dateien gibts kein alignment :mahn:
Delete - Mo 13.06.05 12:55
retnyg hat folgendes geschrieben: |
STATUS_ACCESS_DENIED hat folgendes geschrieben: | | Und das funktioniert auf Windows 9x? Sollte eigentlich nicht, da das File-Alignment dort einen Wert von 0x1000 haben muß. |
bei com-dateien gibts kein alignment :mahn: |
Natürlich gibt es ein Alignment, auch wenn es 16 Byte (1 Paragraph) ist, oder?
Mich würde vielmehr interessieren, wie man UPX eine COM-Datei "vorgaukelt" und dann die Sache packt! Schließlich überprüft UPX normalerweise die Strukturen einer PE-Datei und läßt packen nur innerhalb der Parameter zu. Für Windows 9x gibt es dann besagtes 4kB-Aligment. Ohne das wird die PE garnicht erst geladen, weil der Loader es verhindert. Fazit: mich interessiert, ob die PE danach noch sowohl auf Windows 9x als auch NT sauber läuft.
retnyg - Mo 13.06.05 13:02
STATUS_ACCESS_DENIED hat folgendes geschrieben: |
| Natürlich gibt es ein Alignment, auch wenn es 16 Byte (1 Paragraph) ist, oder? |
sonderbar, wenn ich mit TASM ein "hallo-welt" kompiliere, hat 22 bytes...
STATUS_ACCESS_DENIED hat folgendes geschrieben: |
Mich würde vielmehr interessieren, wie man UPX eine COM-Datei "vorgaukelt" und dann die Sache packt! Schließlich überprüft UPX normalerweise die Strukturen einer PE-Datei und läßt packen nur innerhalb der Parameter zu. Für Windows 9x gibt es dann besagtes 4kB-Aligment. Ohne das wird die PE garnicht erst geladen, weil der Loader es verhindert. Fazit: mich interessiert,
ob die PE danach noch sowohl auf Windows 9x als auch NT sauber läuft. |
http://www.virusexchange.org/positron/delphi/migeel/index.htm
Delete - Mo 13.06.05 13:13
retnyg hat folgendes geschrieben: |
STATUS_ACCESS_DENIED hat folgendes geschrieben: | | Natürlich gibt es ein Alignment, auch wenn es 16 Byte (1 Paragraph) ist, oder? | sonderbar, wenn ich mit TASM ein "hallo-welt" kompiliere, hat 22 bytes... |
Wirst du recht haben. Habe ich verwechselt mit Speicher-Alignment. Ist eben 1 Byte.
Danke. Ich schau's mir an.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!