Entwickler-Ecke
Windows API - Minimale System.pas + SysInit.pas für Win 7
spawn89 - Sa 19.03.11 14:45
Titel: Minimale System.pas + SysInit.pas für Win 7
Hi,
ich suche minimale Versionen der System.pas und SysInit.pas, welche in Windows 7 lauffähig sind.
Folgende 2 funktionierten super auf XP:
System.pas
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:
| unit System;
interface
procedure _HandleFinally;
type TGUID = record D1: LongWord; D2: Word; D3: Word; D4: array[0..7] of Byte; end;
TDLLProc = procedure(Reason: Integer); TDLLProcEx = procedure(Reason: Integer; Reserved: Integer);
procedure _Halt0;
var ExitCode: Integer;
implementation
procedure _Halt0; assembler; asm mov eax, [ExitCode] leave end;
procedure _HandleFinally; assembler; asm mov eax, True end;
end. |
SysInit.pas
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:
| unit SysInit;
interface
var TlsIndex: Integer; TlsLast : Byte; PtrToNil: Pointer;
var HInstance: Cardinal; GetCommandLine: PAnsiChar;
procedure _InitExe;
implementation
procedure _InitExe; assembler; asm mov eax, [ebp+$08] mov [HInstance], eax mov eax, [ebp+$10] mov [GetCommandLine], eax end;
initialization _InitExe;
end. |
Wenn ich jetzt folgende Test-dpr auf Win 7 starte, bleibt der Prozess noch nach der MessageBox offen und schließt sich nie.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| program HelloWorld;
function MessageBoxA(hWnd: Cardinal; lpText, lpCaption: Pchar; uType: Cardinal): Integer; stdcall; external 'user32.dll' name 'MessageBoxA';
begin MessageBoxA(0, 'Hello World', 'test', 0); end. |
BTW: Die KOL-Sys-Units funktionieren auch auf Win 7.
Ich bin mir sicher hier weiß jemand woran das liegt, bitte helfen. :cry:
Und keine Diskussion über Sinn/Unsinn.
Danke :!:
FrEaKY - So 20.03.11 03:25
Ich sag es ja... Windows 7 ist einfach nur sch**** :autsch:
Ich nehme mal an du arbeitest an einer 64K demo oder sowas in der Art, nicht?
Kann dir aber leider auch nicht helfen.
Delete - So 20.03.11 04:00
Warum ist alles, was man nicht gleich versteht *mist*e?
FrEaKY - So 20.03.11 06:29
@Luckie
Verstehst du es denn? Warum hilfst du ihm dann nicht...
Delete - So 20.03.11 13:45
Ich verstehe es auch nicht, was aber nicht heißt, dass das gleich Mist ist.
Delphi-Laie - So 20.03.11 19:45
Darf ich fragen, was das bezweckt? Ist das ein Experiment, oder wozu ist das gut? Kann man auf derlei kastrierte elementare Units noch irgendetwas aufsetzen, bekommt man damit noch anderweitige Programme mit höherer Funktionalität erstellt?
Oder hat das den Zweck, zu zeigen, daß Windows 7 "Mist" ist (eine Ansicht, die ich durchaus teile, aber es ist immerhin noch das beste aller "Vistas").
Es geht mir nicht darum, den Sinn in Zweifel zu ziehen, sondern es ist pure Neugier.
jaenicke - So 20.03.11 19:58
Ich habe sowas an einem Punkt auch gemacht, das ist auch so ziemlich der einzige sinnvolle Anwendungszweck, den ich sehe:
Und zwar habe ich ein SFX-Modul geschrieben, das logischerweise so klein wie möglich sein sollte. Inklusive der Unzip-Unterstützung und einer visuellen Oberfläche war das dann am Ende ca. 32 KiB groß.
Mittlerweile habe ich es durch ein in C# geschriebenes ersetzt, das mit weniger Mühe noch kleiner wird, glaub das waren jetzt 12 KiB oder so...
Eine derart verstümmelte System-Unit hatte ich dafür aber nicht benutzt...
Ich habe lediglich die SysUtils-Unit stark reduziert und dafür, dass es mit GUI und in Delphi geschrieben war, reichte mir die Grüße.
Meine Vermutung in diesem Fall hier ist _HandleFinally als Ursache. Denn wenn ich mir das so anschaue, ist es ein Wunder, dass das unter XP ohne Probleme funktioniert hat...
FrEaKY - So 20.03.11 21:32
jaenicke hat folgendes geschrieben : |
Ich habe sowas an einem Punkt auch gemacht, das ist auch so ziemlich der einzige sinnvolle Anwendungszweck, den ich sehe:
Und zwar habe ich ein SFX-Modul geschrieben, das logischerweise so klein wie möglich sein sollte. Inklusive der Unzip-Unterstützung und einer visuellen Oberfläche war das dann am Ende ca. 32 KiB groß. |
Nicht jeder programmiert für irgendwelche Kunden oder um sein Programm auf den Markt zu bringen... "Sinnvoll" erscheinen mir extrem kleine Exen durchaus für die Demoszene. Es sei denn, man will in der >1 MB Liga mitmachen, was nicht allzu beeindruckend ist.
jaenicke hat folgendes geschrieben : |
Meine Vermutung in diesem Fall hier ist _HandleFinally als Ursache. Denn wenn ich mir das so anschaue, ist es ein Wunder, dass das unter XP ohne Probleme funktioniert hat... |
Hast eine Idee wie es besser gehen könnte?
(Ich weiß, das ist nicht mein Thread, aber interessiere mich auch für dieses Thema..)
spawn89 - Mo 21.03.11 10:54
Ne, das wird _vorerst_ nicht für Demos genutzt und war schon gar nicht dazu gedacht Win 7 nieder zu machen. :lol:
Einerseits interessiert es mich einfach, drauf gekommen bin ich aber als ich ein paar Komponenten von
jaenicke ersetzen wollte.
U.a. ein Updater und die ExeStream-Kompo, da die zB immer die komplette Exe hin und her schiebt....
Und dieser Updater bzw. 'Settingsloader' soll möglichst klein sein.
Und ja, das wird dann nur privat eingesetzt. Die Kunden bekämen so oder so eine völlig überladene Version.
Ich hoffe jetzt sind alle Fragen geklärt und alle zufrieden. :)
Luckie hat folgendes geschrieben : |
Ich verstehe es auch nicht, |
Du hast nicht zufällig noch Kontakt zu Nico, der mich überhaupt erst darauf gebracht hat? (
Importe/Nico/ [
http://www.michael-puff.de/Programmierung/Delphi/Importe/Nico/MiniDExe.zip]) :)
Vllt könnte man ja die KOL-Sys-Units immer weiter reduzieren, bis es irgendwann auch nicht mehr auf Windows 7 läuft.
So sollte man ja eigentlich dann mitbekommen woran es liegt. :nixweiss:
Delete - Mo 21.03.11 11:40
Leider nein, habe ihn schon lange nicht mehr im ICQ gesehen. Aber ich hatte damit schon unter XP Probleme. Geschrieben war es wohl ursprünglich für Windows 2000.
FrEaKY - Di 22.03.11 06:09
hehe, technisch gesehen ist dieser Rekord ja unbrechbar. Hat er jedenfalls geschrieben. Aber wer weiß...
("TOYOTA - Nichts ist unmöglich" :P )
Danke für die Links.
spawn89 - Di 22.03.11 09:22
SAiBOT hat folgendes geschrieben : |
Hiermit kommst du auf nicht ganz 7kb und musst auf kaum eine Funktion verzichten.
Getestet unter Delphi7/Win7. |
Wie gesagt, die
KOL [
http://kolmck.net/]-Sys-Units funktionieren unter Win 7. Sind mir aber trotzdem zu oversized. :zwinker:
Da gibts das gleiche Problem wie bei den Units oben - Nicht in Win 7 lauffähig.
Naja sooo weit runter wollt ich mit Delphi jetzt auch nicht kommen.
Aber, unterbieten? Gerne - siehe Anhang. (28 bytes) :tongue:
(Nicht direkt von mir^^)
jaenicke - Di 22.03.11 09:36
spawn89 hat folgendes geschrieben : |
Aber, unterbieten? Gerne - siehe Anhang. (28 bytes) :tongue:
(Nicht direkt von mir^^) |
Das zählt nicht, das ist ja eine 16-Bit DOS-Exe, die deshalb logischerweise auch unter 64-Bit z.B. gar nicht mehr läuft...
FrEaKY - Mi 23.03.11 00:52
Was hast du denn vor, spawn89? Da du ja keine Demo machen willst, nehm ich an du bist auch ein Größenfetischist? 8)
spawn89 - Mi 23.03.11 10:25
Steht doch oben. Erstmal schaffen, vllt wird daraus ja mehr wie ne eigene kleine rtl oder was weiß ich...
Komme aber voran, gestern liefs testweise schon unter Win7, heut Abend mehr...
spawn89 - Mi 23.03.11 20:00
Danke für das Interesse, hier die minimalsten Versionen:
SysInit.pas
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| unit SysInit;
interface
procedure _InitExe(InitTable: Pointer);
var TlsIndex: Integer = -1; TlsLast: Byte; const PtrToNil: Pointer = nil;
implementation
procedure _InitExe(InitTable: Pointer); begin end;
end. |
System.pas
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:
| unit System;
interface
procedure _Halt0; procedure _HandleFinally;
type TGUID = record D1: LongWord; D2: Word; D3: Word; D4: array [0..7] of Byte; end; var ExitCode: Integer = 0; procedure ExitProcess(ExitCode: Integer); stdcall; external 'kernel32.dll' name 'ExitProcess';
implementation
procedure _Halt0; begin ExitProcess(ExitCode); end;
procedure _HandleFinally; asm end;
end. |
Die Variablen
TlsIndex,
TlsLast und
PtrToNil aus der
SysInit.pas kann man auch weglassen. Der Compiler schmeißt dann jedoch Fehler, aber die Exe erzeugt er trotzdem.
Compiler: Delphi 2007
Getestet unter: Windows 98, XP 32b, Vista 32b, 7 64b
Resultierende Größe der Exe ohne Modifikationen:
4 KB
FrEaKY - Fr 25.03.11 01:41
Genial! Ich kann nur für XP testen aber da funktioniert es einwandfrei.
Sogar nachdem ich ein Fenster erstellt habe ist es noch immer bei 4 KB. 275% kleiner als mit Standard-RTL mit 15 KB!
Und 9000% kleiner als ein leeres Fenster mit der VCL. :lol:
spawn89 - Fr 25.03.11 10:11
375%* ^^
Das lustige, ich hatte zwichenzeitlich eine Version bei der ich nur Klassen, den Interface-Krims und noch nen bissl Zeugs rausgeschmissen hab und es trotzdem 4 KB ergaben.
Strings und der MemManager waren voll lauffähig. :wink:
FrEaKY - Sa 26.03.11 05:39
Nachdem ich mein Programm weiter ausgebaut hatte (zeichnen von Shapes und so) musste ich zwar die eine 5 KB RTL wieder reinmachen und jede Menge Zeug aus der Windows.pas reinholen, weil es Fehler beim kompilieren gab, aber ich hab einfach noch nicht genug Erfahrung auf dem Gebiet. Mache WinApi erst seit paar Tagen so richtig ;)
Jetzt bin ich zwar auf ~9 KB. Aber immer noch niedriger als normal.
Delphi-Laie - Do 10.05.12 14:57
"Lustig" sind hier vor allem die Prozentangaben zweier Teilnehmer, die mathematische "Kreativität" (genauer: Inkompetenz) offenbaren (entdeckte ich erst vorhin).
Zunächst einmal wurde vergessen anzugeben, ob die Exe-Dateigröße um oder auf soundsoviel % (Prozent) verringert werden konnte. Wohl eher um...
Also, wenn ich man die Größe halbiert, dann wurde sie um und auf 50% reduziert.
Wurde sie um 90% reduziert, dann auf 10%.
Weiter z.B., um 99% und auf 1%.
Reduziert man sie um 100%, dann auf 0%, d.h., die Exe-Dateigröße beträgt 0 Byte. Sie ist nicht lauffähig. Unter DOS stürzt so etwas ab und läßt das Betriebsprogramm einfrieren. 100% ist 1. Die Größe einmal verringern? Dann müßte man sie auch zweimal verringern können. Das ist noch unsinniger, so, wie man bei z.B. einmaliger oder zweimaliger Verkleinerung/Vergrößerung/Verstärkung ins Grübeln kommen kannn, weil das interpretierbar ist (dann doch lieber doppelt, dreifach usw.).
Wie man nun aber um (oder auf?) 275%, 375% oder gar 9000% (!) vermindern konnte, ist ein Geheimnis, das die Prahlhänse, auch wenn es schon ein gutes Jahr her ist, vielleicht noch aufzuklären imstande sind und sich befleißigen werden. Einzige Erklärung, die mir einfällt: Die Zielgröße wurde mit 100% angenommen, der Ausgangszustand waren denn 9000%?! So wird aber nicht prozentgerechnet.
Derbes Fazit: Auch bei der Aufschneiderei sollte man sein Gehirn weiterzulaufenzulassen nicht vergessen, und Programme von Programmierern, die die Elementarmathematik so ignorieren, versuche ich schon deren Auszuprobieren zu umgehen, die bekommen bei mir keine Chance.
Edit: Gut, daß mit dem Gehirn nehme ich demütig zurück, das ist mir jetzt auch eine Portion zu heftig, da ging der Gaul mit mir durch.
spawn89 - Do 10.05.12 20:47
Sehr geehrter Humorloser und Steitsuchender,
ich hoffe das Sie den Dreisatz beherrschen, denn jetzt wird es sehr kompliziert für Sie:
FrEaKY hat folgendes geschrieben : |
Sogar nachdem ich ein Fenster erstellt habe ist es noch immer bei 4 KB. 275% kleiner als mit Standard-RTL mit 15 KB! |
Statt 275%: 375%
100% = 4 KB
375% = 15 KB
FrEaKY hat folgendes geschrieben : |
Und 9000% kleiner als ein leeres Fenster mit der VCL. |
100% = 4 KB
9000% = 360 KB
Trotz das es Sie verärgert, dass Sie in Ihrer Programmiersprache völlig überflüssig große Programme entwickeln, frage ich mich ob Sie als Leichenschänder auch etwas zum eigentlichem Thema beitragen können.
In großem Scham
spawn89
jaenicke - Do 10.05.12 21:33
Du schreibst es ja selbst: Die Prozentangabe bezieht sich auf den kleineren Wert. Deshalb macht es mathematisch keinen Sinn bei dem größeren Wert diese Angaben zu nennen als würden sie sich darauf beziehen, da diese Prozentangaben nichts mit dem größeren Wert zu tun haben...
Da hat
Delphi-Laie schon Recht.
Delphi-Laie - Do 10.05.12 21:56
Die Prozentangabe bezieht sich (nach meinem Wissen und meiner Beobachtung, beides bereits im Zeitraum von Jahrzehnten (wenn auch kaum mehreren und auf keinen Falle vielen) immer auf die Ausgangsgröße (die mit 100% angesetzt wird).
Ansonsten tut es nämlich auch ein einfacher Faktor. Aber 9000% hören sich eben mächtig(er) an.
Streit suchte ich, auch wenn es so klang, eigentlich keinen, sondern ich befand mich in einem merkwürdigen emotionalen Gemisch.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!