Ersetzen des Symbols in Windows * .exe durch plattformunabhängigen Open-Source-Java-Code

8

Erstens ist dies kein Duplikat der sehr häufigen Frage, wie man ein EXE aus Java-Klassen macht. Ich muss das nicht tun.

Um NetBeans RFE # 64612 ohne manuelle Schritte Ich brauche eine Java (6+) -Bibliothek, die eine existierende Windows *.exe -Datei aufnehmen und ihr Icon durch einen Ersatz in einem gemeinsamen ersetzen kann Format. Die ausführbare Datei, die generisch und vorgefertigt ist (in binärer Form verteilt), weiß bereits, wie man eine anwendungsspezifische Konfigurationsdatei lädt und dann die JRE mit verschiedenen Anwendungs-JARs usw. startet; Das einzige Problem ist, dass es ein generisches Symbol hat, und ich möchte dieses Symbol als Teil eines reinen Java-Builds durch ein anwendungsspezifisches Symbol ersetzen, sodass es hübscher aussieht.

Die Bibliothek muss unter einer nichtviralen Open-Source-Lizenz verfügbar sein; plattformübergreifend (muss unter Windows, Linux, Mac, Solaris ausgeführt werden), kann also einige betriebssystemspezifische Hilfsprogramme nicht ausführen; und muss PNG-Eingabe akzeptieren, obwohl die EXE auf XP funktionieren muss, sodass laut Wikipedia das BMP-Format einbetten sollte . Auf einer hohen Ebene, Ant als ein Build-Tool vorausgesetzt, möchte ich etwas wie folgt:

<replaceicon from="app.exe" to="hello.exe" icon="hello.png"/>

Weiß jemand, ob bereits ein Werkzeug existiert, das diesen Spezifikationen entspricht? Von verschiedenen Websuchen fand ich Launch4J , aber das scheint nur zu verzweigen windres für die eigentliche Arbeit, also nicht trivial tragbar. Ich fand JSmooth , was vielversprechender aussieht - es scheint Java-Code zu enthalten, um den ICO-Codec zu handhaben und PE-Dateien zu manipulieren - aber es ist GPL. WinRun4J sucht nach nativem Code für die Symbolbearbeitung, obwohl es mir schwer fiel, seinen Quellen zu folgen. Jimi behandelt angeblich das ICO-Format (zu diesem Thema scheint auch der Standard javax.imageio ), aber ich denke, nein Möglichkeit zum Aktualisieren von PE-Ressourcen.

    
Jesse Glick 28.12.2011, 17:40
quelle

4 Antworten

2

Gemäß meinem Eclipse Rich Client Platform-Produkt-Generator

  • Linux benötigt ein XPM-Symbol
  • MacOSX benötigt eine ICNS-Datei
  • Solaris benötigt 4 PM-Symbole, Large, Medium, Small und Tiny
  • Windows (32 Bit) benötigt 6 separate BMP-Bilder oder eine ICO-Datei.

Ihr Distributionspaket muss alle diese Dateien enthalten, damit sie plattformunabhängig sind.

Ich habe nicht mit den anderen Plattformen gearbeitet, aber unter Windows können Sie das Programmsymbol ändern, indem Sie mit der rechten Maustaste auf das vorhandene Symbol klicken und mit der linken Maustaste auf Eigenschaften klicken. Klicken Sie mit der linken Maustaste auf die Registerkarte Verknüpfung, und klicken Sie mit der linken Maustaste auf die Schaltfläche Symbol ändern. Blättern Sie zum Verteilungsverzeichnis und wählen Sie die ICO-Datei.

Ich bin sicher, dass es möglich ist, die Windows-Symboländerung zu automatisieren, wenn Sie das Verteilungspaket bereitstellen. Ich kann mir vorstellen, dass es auf den anderen Plattformen möglich ist.

    
Gilbert Le Blanc 28.12.2011 18:31
quelle
2

Es gibt das Projekt PE / COFF 4J , das in der Lage ist zu tun, was Sie wollen. Es ist lizenziert unter der Common Public License (CPL) .

Einige Anmerkungen dazu:

  • Der Autor scheint der gleiche zu sein wie für WinRunJ . Dieses Projekt hat tatsächlich einen PE-Ressourceneditor namens RCEDIT.exe , verwendet jedoch native Windows-Aufrufe, wie Sie selbst darauf hinweisen. Warum der Autor sein eigenes Projekt (PE / COFF 4J) nicht verwendet hat, schlägt mich. Es gibt mir Anlass zur Sorge, dass das Projekt PE / COFF 4J möglicherweise aufgegeben wird.

  • Die Dokumentationsseite für PE / COFF 4J erwähnt nur, dass das Projekt in der Lage ist, eine PE-Datei zu parsen, aber als Datei kann ich analysieren, dann etwas ändern (zB eine Icon-Ressource) und dann schreiben Bild zurück auf die Festplatte.

Wie Sie habe ich auch nach einer reinen Java-Lösung gesucht, die Ressourcen in einer .EXE-Datei (PE-Datei) manipulieren kann und leer ausgegangen ist. Dies ist die beste Wette bisher.

Das Ersetzen einer Symbolressource in einer EXE-Datei ist bei Verwendung der systemeigenen Win32-Aufrufe relativ einfach. Wenn Sie es aus reinem Java machen, müssen Sie sicherstellen, dass die PE-Datei konsistent ist, wenn Sie sie auf die Festplatte schreiben. Ich habe das PE-Dateiformat nicht gründlich untersucht, aber ich nehme an, dass sich viele Referenzen ändern, wenn Sie eine Ressource ersetzen oder hinzufügen, nicht nur die, die sich auf die Ressource bezieht, die Sie ersetzen / hinzufügen.

    
peterh 18.02.2014 16:02
quelle
1

Es sieht so aus, als ob das Eclipse-Projekt eine kleine Java-Anwendung geschrieben hat, um die Symbole zu ersetzen.

IconExe aus dem Eclipse-Projekt

Die App.exe und app64.exe in Netbeans scheinen die folgenden Symbole in der Ressourcen-Sektion zu haben:
48 x 48 32bit
32 x 31 32bit
48 x 48 8bit
31 x 31 8bit
16 x 16 8bit

Ich schätze das 32 x 31 ist ein Fehler

    
oyarzun 01.07.2014 21:06
quelle
0

Sie müssen einfach die erste ICO oder BMP im Ressourcenbereich der ausführbaren Dateien ersetzen. Dieser wird automatisch vom Explorer als anzuzeigendes Symbol ausgewählt.

    
jjs 28.12.2011 19:07
quelle