![]() |
EXE kleinstmöglich machen
Hallo,
bisher hat mich die Größe meiner EXEn ja nicht wirklich interessiert, aber im Moment entwickeln wir ein Programm, dass über das Internet upgedatet werden muss. Und da es noch etliche User mit Modemzugang gibt, sollte die EXE kleinstmöglich sein. Ich habe mal ein leeres Projekt erstellt (ein Fenster mit einem CLOSE-Button) und da hat die EXE bereits knapp 400 kB! Und unsere Schmerzgrenze war eigentlich ca. 300 kB... Daraufhin habe ich alle Compileroptionen für Debug-Informationen ausgeschaltet und erwartet, dass die EXE deutlich kleiner wird: Sie ist aber nach erneutem Kompillieren exakt genauso groß, wie mit eingeschalteten Debug-Infos! Wie kann ich denn die EXE "kleinkriegen"? Gruß Andreas |
Re: EXE kleinstmöglich machen
da musst du non-vcl proggen.
|
Re: EXE kleinstmöglich machen
und wie soll ich das machen, wenn das Programm eine grafische Benutzeroberfläche haben soll...
|
Re: EXE kleinstmöglich machen
Als erstes mal: nonVCL Programmierung. Hilft ungemein.
Als nächstes: unnötige Units aus dem uses nehmen. Hilft auch bissel was. Dann als letztes: Du schreibst sämtliche Delphi Standard Units neu, und zwar als z.B. MySysUtils. Das hilft extrem viel, wenn du nur das reinschreibst, was du auch wirklich brauchst. EDIT: Schau dir Luckies WinAPI Tutorial an. |
Re: EXE kleinstmöglich machen
Du kannst sie mit UPX (oder inenem anderen exe-packer) packen - die komprimierung ist aber höchstens genausogut wie ein 7zip-sfx (
![]() Viel besser wäre es, ganz einfach differenzielle Patches zu erstellen. Z.B. ![]() ansosnten kannst du NonVCL programmieren. Luckie hat da ein paar tutorials - ![]() Du verzichtest dann auf VCL-Kompoentne und erstellst die deine fenster und Controls selber, mit Hilfe der WinAPI. Damit kann man extrem kleine Programme schreiben. Ansonsten wäre natürlcih ein kompletter Verzicht auf GUI möglich, oder das auslagern der programmlogik (die dann alleine geupdated wird) in eine DLL (mit statischer Linkung ziemlcih bequem möglich). Was für dich das beste ist, kann man am besten herausfinden, wenn du kurz erklärst, was dein Programm genau machen soll. |
Re: EXE kleinstmöglich machen
Desweiteren könntest du Programmteile die du oft Updaten willst/musst in DLLs auslagern.
Grüße Faux |
Re: EXE kleinstmöglich machen
Oder alles in Runtimepackages.
|
Re: EXE kleinstmöglich machen
Ok, das schockiert mich alles ganz schön: reine API generierte Oberflächen? Ich will doch das Rad nicht neu erfinden! Aber wenn's nicht anders geht...
Trotzdem natürlich vielen Dank bis hier hin! Dennoch nochmals nachgefragt: Müsste die EXE nicht kleiner werden, wenn man die Debug-Informationen rausnimmt? |
Re: EXE kleinstmöglich machen
Übrigens: Das Rad neu erfindent ist leicht übertrieben. Schau dir mal ein C(++) Programm an, da ist alles nonVCL. Die VCL ist nunmal benutzer(programmierer)freundlich, aber dafür auch groß und etwas langsamer.
|
Re: EXE kleinstmöglich machen
Oder du entwickelst für .NET und dann sind deine Anwendungen winzig. Der Anwender muß jedoch auf seinen Rechner erst mal die passende .NET-Version haben. Und dies ist ein ganz schöner Brocken.
Aber mittlerweile hat ein überwiegender Teil der aktuellen PC's .NET 1.1 oder auch schon 2.0 drauf. Ist damit ähnlich wie Delphi für Win32 und Runtimepackages. |
Re: EXE kleinstmöglich machen
Zitat:
Zitat:
Zitat:
|
Re: EXE kleinstmöglich machen
Zitat:
|
Re: EXE kleinstmöglich machen
Ich auch nicht - aber wenn mans ganz klein haben will, ist es eine gute Möglichkeit.
Und: Das Rad neu erfinden heißt für mich, die komplette EXE mit nem HEX-Editor schreiben. ;) |
Re: EXE kleinstmöglich machen
Danke an alle!
|
Re: EXE kleinstmöglich machen
jbg: Der Delphi-Compiler kennt Smartlinking?!
|
Re: EXE kleinstmöglich machen
Zitat:
Hier ein einfaches Beispiel:
Delphi-Quellcode:
program Test;
procedure TestProc; begin WriteLn('Diese Prozedur wird gar nicht in die Exe-Datei aufgenommen und hat auch keine blauen Punkte links stehen'); end; * begin * WriteLn('MyProgram'); * ReadLn; * end. |
Re: EXE kleinstmöglich machen
und was ist mit dem da:
Delphi-Quellcode:
und jetzt das Programm:
unit uImportant;
interface procedure NeverUsed; procedure Used; implementation procedure NeverUsed; begin DoSomeThingIrrelevant; end; procedure Used; begin DoSomeThingRelevant; end; end.
Delphi-Quellcode:
Wird NeverUsed mitgelinkt?
program Test;
{$APPTYPE CONSOLE} uses uImportant; begin Used; end; |
Re: EXE kleinstmöglich machen
Compiliers doch und schau, ob daneben blaue Punkte stehen :wink:
|
Re: EXE kleinstmöglich machen
Übertreibt ihr da nicht ein bisschen ? Ein nonVCL-Programm ist verdammt klein, hier geht es nur noch um Bytes/KB. Bis man sich dann die Units geschrieben hat, kann man doch gleich mit Assembler unter z.B. Win32 anfangen. In Assembler wird dann aus der 300 eine 3.
|
Re: EXE kleinstmöglich machen
@freejay
Also 400 KB sind nicht viel, auch für ein normales 56K Modem nicht. Und mit UPX bist zur Komprimmierung der EXE gut bedient. NonVCL ist nur eine Alternative, wenn Du Zeit hast Dich damit auseinanderzusetzen. Da kannst Du durch das Weglassen einiger in der Uses Klauses stehenden Units Platz sparen. Das schnellste Ergebnis im Verhältnis zur Zeit hast Du ohne NonVcl. Beste Grüße Go2EITS |
Re: EXE kleinstmöglich machen
Zitat:
|
Re: EXE kleinstmöglich machen
Zitat:
![]() UPX zerstört dir das komplette Sperichermanagement von Windows, wie bereits geschrieben habe. dann lieber ein SFX. @freejay: Hast du denn meinen Beitrag gelesen? ![]() |
Re: EXE kleinstmöglich machen
@daniel G
Die Probleme kannte ich noch nicht mit UPX. Das sehe ich mir mal an... Aber der Kunde bekommt eine EXE. Ein Zip bedeutet, dass das Programm erst das Update entzippen muss und dann die alte EXE mit der neuen EXE überschreiben muss. Ob er dies der Threadersteller will? Kann es sein, dass einige Router die EXE nicht durchlassen?????? :roll: [Nachtrag] Phoenix hat in seinem Beitag mit UPX keine Probleme. Für den Zweck wird es reichen. ![]() [/Nachtrag] |
Re: EXE kleinstmöglich machen
Zitat:
|
Re: EXE kleinstmöglich machen
Zitat:
|
Re: EXE kleinstmöglich machen
Tja, die beste Möglichkeit die Exe klein zu bekommen dürfte wohl - wie bereits erwähnt - die Verwendung des .Net Frameworks sein.
UPX (und andere Exe-Packer) so kategorisch abzulehnen wie gotos (*hüstel*) halte ich für grundsätzlich falsch. Ich sehe ein dass es keinen sinn macht eine 100MB-Exe zu UPXen, bei einer 1MB-Exe dürfte das das Windows Speichermanagement aber heutzutage herzlich wenig stören ;) Bei verwendung von Zip o.ä. bleibt eben immer, dass man mitunter auch noch kostenpflichtige Zusatzsoftware braucht - bei .Net gewissermaßen zwar auch, aber das kostet nix und ist sowieso meistens vorinstalliert. Ergo: -> .Net |
Re: EXE kleinstmöglich machen
Zitat:
|
Re: EXE kleinstmöglich machen
Zitat:
|
Re: EXE kleinstmöglich machen
Bei mir war es nicht vorinstalliert. Das Netframework ist hinzu auch noch groß und muss erst installiert werden. Dadurch sinkt die Komfortablität der Anwendung und sie wird im Prinzip nur noch größer.
|
Re: EXE kleinstmöglich machen
[quote="Daniel G"]
Zitat:
|
Re: EXE kleinstmöglich machen
Zitat:
alternativ im updater das 7zip-backend (sollts als dll geben) integrieren. Sollte ich mal update brauchen, werd ichs wohl so machen: 1. Dateistruktur erstellen /versions/Ma.Mi.Re.Bl/program.exe (Major,Minor,Revision,Build) 2. VPatch drüber laufen lassen, ergebnis program_Ma.Mi.Re.Bl_to_latest.upd 3. Ergebnisse mit 7zip komprimieren Das updateprogramm holt sich per FTP die benötigte (self)Ma.Mi.Re.Bl_to_latest_.7zip, entpackt sie, und lässt sie vom VPatch-Updater auf die exe patchen. Aber wie gesagt - was der threadersteller will, wissen wir noch nciht genau. |
Re: EXE kleinstmöglich machen
Zitat:
|
Re: EXE kleinstmöglich machen
Mhh, wenn es möglichst klein sein soll...
mit VCL. Wer noch kleinere Exes haben möchte, sollte downgraden. Ich habe ein Projekt (leere Exe, ohne Komponenten, Codezeile) mit Delphi 3 Pro compiliert. 181.248 Byte. NonVCL fängt bei 20 kB an, KoL auch etwa. jeweils nur die .exe komprimiert
Delphi-Quellcode:
mini_unit.zip (647 KB)
04.08.2006 23:58 76.089 mini.uha
04.08.2006 23:41 77.824 Mini_Pecompact.exe 04.08.2006 23:57 77.548 Mini.7z 04.08.2006 23:41 80.384 Mini_upx.exe 04.08.2006 23:56 81.868 Mini.rar 04.08.2006 23:41 83.968 Mini_aspack_Trial.exe 04.08.2006 23:55 97.832 Mini.zip 04.08.2006 23:41 Original >> 181.248 Mini.exe 8 Datei(en) 756.761 Bytes ![]() ^^ wer sich das mal anschauen möchte ist incl. Source |
Re: EXE kleinstmöglich machen
Bitte häng die Datei an, dazu gibt es das Feature. Bei Rapidshare brauche ich immer fünf Minuten bis ich den Donloadlink irgendwo auf der Seite gefunden habe und weiß dann doch nicht, ob ich morgen nicht doch fünf Waschmaschinen geliefert bekomme. :roll:
|
Re: EXE kleinstmöglich machen
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: EXE kleinstmöglich machen
Zitat:
Sie können nicht einfach sagen: "Du hast vor 10 Jahren kostenlos ein Programm von uns bekommen, jetzt will ich aba Geld dafür haben. Oder du musst es ausbauen." Daher: - Dateien mit 7z packen - 7z-Dll in Programm integrieren (wird automatisch entpackt) - oder zip nehmen. Dass sollte immer kostenlos entpackbar sein. - oder eigenen Algo implementieren (Ansätze gibt es schon in der CodeLib) |
Re: EXE kleinstmöglich machen
Zitat:
Die sauberste Lösung wäre in dem Fall wohl tatsächlich ein eigenes Packverfahren, oder die Verwendung eines Open Source Algorithmus. |
Re: EXE kleinstmöglich machen
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz