2009-04-29 4 views
5

An einem Punkt hatte ich ein nettes kleines Komprimierungsprogramm, das meine Delphi-kompilierten EXEs zu einer kleineren Download-Größe zerschmetterte, aber jetzt kann ich es nicht finden. Irgendwelche Empfehlungen?Delphi EXE Kompressor?

Gibt es auch Nachteile bei der Verwendung dieser Dienstprogramme? (Ich benutze sie hauptsächlich, um die Download-Zeiten für ländliche/Dial-up-Benutzer zu verkürzen).


Verwandte Frage: Are there any downsides to using UPX to compress a Windows executable?

+0

Das ist fast ein Duplikat - ich habe einen Link zu der anderen relevanten Frage in [Delphi] hinzugefügt. – mghie

Antwort

13

Vor Jahren habe ich in meine ausführbare Datei komprimiert, um den Download kleiner zu machen.

Was ich getan habe, und was ich für Sie empfehle, ist stattdessen ein Installationsprogramm wie Inno Setup zu verwenden. Es erstellt nicht nur eine einzelne EXE, die dein Programm installiert/deinstalliert, sondern komprimiert diese EXE auch praktisch so sehr, wie es ein separater Compressor mit deiner ausführbaren Datei tun würde.

Wenn das Programm installiert ist, wird es dekomprimiert, so dass es nie als Virus erscheint und die Ladezeiten nicht erhöht.

So habe ich die Vorteile von kleineren Download-Größe und ein professionell aussehendes Installationsskript zur gleichen Zeit.

p.s. Inno Setup ist kostenlos.

+4

+1 für den Inno Setup-Tipp: Es enthält Deflate, Bzip2 und 7-Zip LZMA-Dateikomprimierung, so dass sehr kleine Installer möglich sind. Es wird leuchten, wenn es ähnliche Dateien zum Komprimieren gibt. Ich habe eine Installation, bei der das ZIP-Paket etwa ein Drittel größer ist als die Installer-Datei (beide enthalten die gleichen Dateien). – mghie

4

Ich weiß nicht, von jedem, das speziell für Delphi, aber UPX ist sehr beliebt für diese Art der Sache. Der einzige Nachteil ist, dass die ausführbare Datei beim Start dekomprimiert werden muss, und das kann einige Zeit dauern. Es scheint jedoch sehr schnell für normale ausführbare Dateien zu sein.

0

UPX sollte funktionieren, obwohl es nicht Delphi spezifisch ist.

12

Die Empfehlung ist, dass Sie nicht:

  • EXE Kompressoren Ihre Anwendung scheinen wie ein Virus (Selbst modifizierenden)
  • gzip/zip sind ebenso effektiv bei der Komprimierung und sie basteln nicht machen können Ihre App
  • EXE Kompressoren machen die Ladezeiten Ihrer Anwendung erhöhen (es sei denn, Sie sind nur über das Setup-Programm zu sprechen, die eine andere Sache

Diese verrückten suchen Seite ist bringt ein Argument auf, das ich in der fernen Vergangenheit gehört habe (ob es wahr ist oder noch nicht heute, ich bin mir nicht sicher, moderne Verpacker haben wahrscheinlich heute eine andere Strategie) Dieser Artikel verweist auf Win32! :)

http://topic.csdn.net/t/20000408/08/6785.html

Moderne Multitasking OSes wie Windows 95/98 und NT verwenden, was ein "virtueller Speicher" System bezeichnet. Wenn Programme starten, wird der gesamte Code nicht sofort in den Speicher beim Start geladen, wie es bei DOS Programmen der Fall war. Stattdessen werden nur die Teile des Codes, der aktiv ausgeführt wird, in den Speicher gespeichert. Sagen Sie beispielsweise Ihr Programm verfügt über eine Druckoption in seinem Menü und Code, der das Drucken verarbeitet. Dieser Code wird nur in den Speicher geladen, wenn die Funktion Drucken zuerst vom Benutzer ausgewählt wird. Und wenn, nachdem der Code in Speicher geladen wird die Druckfunktion nicht für eine Weile verwendet wird, wird das System „verwerfen“ den Code, die Freigabe des Speichers es besetzt, wenn eine andere Anwendung dringend Speicher benötigt. Dies ist Teil eines Prozesses namens "Paging" und ist vollständig transparent für das Programm.

Ein anderer Weg Paging unter Win32 spart Speicher ist es mehrere Instanzen eines Programms (oder DLL) zu der gleichen Speicher für Code verursacht.In anderen Worten, unter normalen Umständen gibt es keinen wirklichen Unterschied in der Menge der physischen Speicher für Code zugewiesen zwischen Start 100 Instanzen eines Programms und Starten einer Instanz.

Wenn alle Win32-Programme verhalten mich wie DOS-Programme, alles in Speicher zu laden und dort zu halten, bis das Programm beendet und auch nicht beliebige Speicher zwischen Instanzen mehr teilen, können Sie wahrscheinlich vorstellen, wie schnell physischer Speicher konnte Führen Sie auf Systemen mit einer begrenzten Menge, aus, was das Starten von Datenträgeraustausch verursacht.

Noch dies ist genau das, was aktuelle Win32 EXE-Kompressoren zu Ihrem EXE/DLL's tun! Sie gehen komplett gegen das Paging-System des Betriebssystems durch dekomprimieren aller Code in den Speicher und halten es dort bis zur Beendigung. Und weil der Code nicht in einem "rohen" Format in der EXE-Datei gespeichert ist (d. H. , wie er im Speicher abgelegt ist), kann das Betriebssystem keinen Code zwischen mehreren Instanzen teilen.

+2

Siehe auch: http://jrsoftware.org/striprlc.php#execomp –

+2

Ein Mitarbeiter hat ein Benchmarking mit und ohne UPX durchgeführt. UPX war ein Gewinn für Netzwerk-Shares und ein Verlust für lokale Laufwerke. Natürlich kann ich nicht die tatsächlichen Zahlen bei dir angeben (ich erinnere mich nicht an sie, und sie würden spezifisch für unseren Code sein), also zögere nicht, mich zu ignorieren :). –

+0

Jordan Russell (jrsoftware) ist der Entwickler von Inno Setup, und der Link, auf den sich Tim Sullivan in seinem obigen Kommentar bezieht, ist das StripReloc-Programm von Jordan. Jordan ist offensichtlich ein Experte für Komprimierung und man kann davon ausgehen, dass er es im Inno Setup richtig gemacht hat. – lkessler

4

Die, an die Sie wahrscheinlich denken, ist ASPack - es ist ein EXE-Kompressor in Delphi geschrieben, aber wird jede EXE komprimieren. Es kann jedoch auf Delphi-EXEs besonders gut sein. Ich stimme den anderen Antworten zu, dass Sie keinen EXE-Kompressor verwenden sollten, nur um Download-Zeiten zu sparen. Es kann bestimmte Situationen geben, in denen eine EXE-Komprimierung eine gute Idee ist, aber im Allgemeinen nicht.

Verwenden Sie stattdessen einen guten Installationsersteller, besonders wenn Sie einen finden, der 7zip-Komprimierung verwendet. Ich weiß, InstallAware verwendet 7zip intern für maximale Komprimierung. Abhängig davon, welche Delphi-Versionen Sie besitzen, haben Sie möglicherweise auch eine InstallAware-Lizenz.

Wenn nichts anderes Sie können ein selbstextrahierendes Archiv mit grundlegenden Installationsverhalten mit 7zip kostenlos erstellen. Es ist ein separater Download für SFXs für Installateure.

+2

Nachdem ich die Installation von Delphi 2007 in Aktion gesehen habe, würde ich InstallAware nicht mit dem sprichwörtlichen 10-Fuß-Pol anfassen. Ich kann 'glauben, dass die Verwendung von mehr als die Komprimierung der ausführbaren Datei reduziert wird. – mghie

+4

Ich denke, dass Embarcadero Innosetup für das Delphi-Setup verwendet haben sollte. Ich musste vor kurzem ein komplexes Setup einschließlich SQL Server 2008 durchführen, die erforderliche Komponente während der Installation herunterladen. Ich konnte nicht glauben, wie großartig Inno Setup war, sobald ich mich daran gewöhnt hatte. – Tom

+1

InnoSetup ist wirklich großartig und kann es nicht mehr empfehlen. Ich habe eine sehr komplette Installation damit gemacht. Ich würde nie wieder zu Wise/InstallShield usw. zurückkehren ... – Nazar

1

Ich glaube, Terminal-Server (wie Citrix) werden den gleichen Speicher für Ihre binäre Anwendung verwenden, wenn sie unkomprimiert ist. Das bedeutet, dass eine komprimierte EXE in einer Citrix-Umgebung ein kleines Desaster riechen könnte.

+1

Es wird 'shared memory' genannt und wird bei mehreren EXE- oder DLL-Instanzen verwendet. Es sind nicht nur Terminalserver, sondern alle modernen Betriebssysteme. Die Idee ist einfach. Wenn die virtuelle Speicherseite (4 KB) bereits vorhanden ist, verweisen Sie einfach darauf. Wenn ein einzelner Prozess diesen Speicher ändert, privatisiert er ihn in einer Methode, die als Kopie-auf-Schreiben bezeichnet wird. JEDOCH müssen Sie sich daran erinnern, dass nicht alle ausführbaren Kompressoren sich gleich verhalten, und einige können so konfiguriert/voreingestellt sein, dass sie freigegebene Abschnitte überspringen. –

-1

Sie können PECompact verwenden, da Leute es nicht einfach entschlüsseln können, und wie Test zeigte (auf der Hauptseite gezeigt, scrollen Sie einfach ein bisschen herunter), ist es besser als ASPack oder UPX, ich habe es auf meinen vorherigen Delphi-Projekten verwendet

0

ich auch für upx stimmen. Neben den genannten Nachteilen schützt es auch vor grundlegenden Reverse-Engineering und diesen lahmen "Resource Hacker" -Tools. Was übrigens viel ist, und die meisten von ihnen können eine komprimierte ausführbare Datei nicht öffnen.

3

Verwenden UPX mit lzma Option für max Kompression.

upx --lzma yourfile.exe 
2

Die Haupt Unannehmlichkeit einer komprimierten EXE oder DLL ist, dass das Betriebssystem nicht den Code unter mehreren Instanzen teilen kann.
Sie verschwenden also Speicher, müssen jedesmal dekomprimieren, wenn Sie eine Instanz starten, zeigen ein virenähnliches Verhalten ohne einen Downloadvorteil gegenüber einer komprimierten Installation.
Nur beim Direktstart von einem Netzlaufwerk kann ein positiver Fall auftreten.

+0

Ja, es kann Code teilen, aber es hängt davon ab, wie es gepackt ist. Der meiste gemeinsam genutzte Code befindet sich in DLLs. PECompact ignoriert zum Beispiel freigegebene Abschnitte von DLLs standardmäßig. Wenn Sie Ihre DLLs nicht komprimieren, wird gemeinsam genutzter Speicher zwischen Prozessinstanzen dieser DLLs nicht von der Komprimierung Ihrer Haupt-EXE beeinträchtigt. –