Jeder kennt das Problem: man schreibt ein kleines Programm und wenn man sich einigermaßen an Programmierstrukturen hält, hat man schnell ein paar Dateien zusammen, die dann allerdings das deployen des Programms einigermaßen erschweren. Oftmals ist es schön, wenn man nur eine einzelne ausführbare Datei hat, die man leicht verteilen kann.
Dafür gibt es unter anderem selbstextrahierende Archive, die man dafür verwenden kann. Ich will hier eine Möglichkeit mit kostenlosen Mitteln zeigen, wie man so etwas schnell und einfach erstellen kann.

Notwendige Tools und Dateien

Damit man mit 7-Zip professionelle selbstextrahierende Archive erzeugen kann, benötigt man ein paar Tools und Dateien im Hintergrund:

7-Zip

Zuerst benötigt man natürlich das Komprimierungstool selbst. Dieses kann man hier downloaden:
http://www.7-zip.de

7Z-SFX

Damit man konfigurierbare selbstextrahierende Archive erzeugen kann, benötigt man außerdem noch die SFX-Dateien. Diese sind ein bisschen schwer zu finden:
https://github.com/chrislake/7zsfxmm/releases
Hier findest man relativ aktuelle Dateien. Allerdings funktionieren diese nur bei 64Bit Systemen. Daher hab ich weiter gesucht und hab auch noch ältere Versionen gefunden:
https://github.com/chrislake/7zsfxmm/wiki/Download
Man sollte hier auf jeden Fall ein bisschen testen, was funktioniert. Ich habe jetzt die alten Dateien verwendet und hatte damit keine Probleme

Resource Hacker

Damit das Ergebnis dann auch noch ein passendes Icon bekommt und die Datei-Infos angepasst werden können, muss man ein bisschen in den Reosurcen der SFX-Dateien rumbasteln. Das ist aber nicht weiter schwierig.
Ein entsprechendes Tool wäre der Resource Hacker:
http://www.angusj.com/resourcehacker

Damit hat man dann erst einmal alles notwendige beisammen. Einen Texteditor benötigt man zusätzlich noch und natürlich die Dateien, die man verpacken möchte

Vorgehen

1: Dateien packen

Zuerst erzeugt man sich aus den Dateien, die man zusammenpacken will ein Archiv mit 7Zip. Dabei sollte man darauf achten, dass man
1.) als Archivformat “7z” auswählt 2.) als Kompressionsverfahren “LZMA” auswählt. Andere Verfahren sollten auch funktionieren, aber da gehe ich jetzt nicht darauf ein

2: Arbeitsverzeichnis anlegen

Wir legen uns ein Arbeitsverzeichnis an, in das wir die benötigten Dateien reinkopieren. Als erstes wäre das dann die erzeugte 7z-Datei.

3: Config.txt im Arbeitsverzeichnis erzeugen

die config.txt ist notwendig, um zu steuern, wie sich das Programm verhalten soll. Also welches Programm soll gestartet werden, soll der Extrahierungsprozess angezeigt werden etc.
Welche Parameter es gibt, kann man auch auf dieser Seite einsehen:
https://github.com/chrislake/7zsfxmm/wiki/Download
Mein Beispiel sieht zum Beispiel so aus:

;!@Install@!UTF-8!
RunProgram="myApplication.exe"
GUIMode="2"
;!@InstallEnd@!

Letztendlich bedeutet das nur, dass die Executable “myApplication.exe” gestartet werden soll (die sich natürlich im Archiv befindet) und keine Gui vom Extrahierungs-Prozess angezeigt werden soll. Das ist vermutlich der Standardfall, wenn man so etwas machen will.

4: SFX-Datei ins Arbeitsverzeichnis kopieren und bearbeiten

Als nächstes holen wir uns die richtige SFX-Datei. Da ich weiter oben geschrieben haben, dass wir als Kompressionsverfahren LZMA verwenden, kopieren wir also die Datei 7zsd_LZMA.sfx in das Arbeitsverzeichnis.
Dann öffnen wir diese Datei gleich mit dem Resource Hacker. Ich will jetzt nicht im Detail auf das Bearbeiten von Resourcen eingehen, sondern lediglich zeigen, wie man das Icon austauscht.
Im ResourceHacker wird rechts ein Treeview angezeigt, bei dem man unter anderem auch Icon Group findet. Wenn man diesen Zweig aufklappt, findet man hier eine Resource mit dem Namen 101
Wir verwenden jetzt den Button der Toolbar Add Binary or Image Resource und wählen uns eine Ico-Datei aus, die wir hinzufügen wollen. Als Resource-namen vergeben wir wieder die 101, damit das bisherige Icon überschrieben wird. Das Ganze speichern wir dann und das war’s schon.

5: Script zum Generieren erzeugen

Zu guter Letzt fügen wir dann alles mit Hilfe eine Batchscripts zusammen.
Wie funktioniert das system eigentlich generell? In der Exe gibt es erst einen Header, der ausgeführt werden soll. Diesen finden wir in der SFX-Datei. Dann brauchen wir die jeweilige Konfiguration und letztendlich den eigentlichen Inhalt. Die einzelnen Bestandteile werden einfach mit einem Copy-Befehl zusammengeführt. Das Ganze sieht dann so aus:

copy /b 7zsd_LZMA.sfx + config.txt + myApplication.7z myApplication.exe

Dieses Script schreiben wir am besten in eine Batchdatei und führen das Ganze dann aus.

Ergebnis

Das Ergebnis ist jetzt eine neue Datei myApplication.exe mit dem jeweiligen Icon, das wir ausgewählt haben. Wenn wir die Exe ausführen, wird sie unsichtbar für den User ins Tempverzeichnis extrahiert und die angegebene Datei wird ausgeführt.

Weitere Tipps und Infos

Das Schöne an diesem System ist, dass alle notwendigen Dateien in einem Ordner gespeichert werden können. Mit dem ResourceHacker können wir die sfx-Datei genau für dieses Projekt anpassen. Also Icon verpassen, Fileversion und Productversion etc setzen und so weiter. Die Anpassungen haben keine Auswirkung auf andere Projekte und können sie auch schön in eine Versionsverwaltung eingecheckt werden.