Seite 1 von 1

Wie kann ich ein Icon einer bestehenden EXE-Datei zuweisen?

Verfasst: 24.11.2005 00:55
von Tracker
Ich möchte einem Anwender die Möglichkeit geben, mit einem FileRequester ein beliebiges Icon (Format *.ico, 32x32 Pixel) auszuwählen und einer anderen EXE-Datei als Standard-Icon zuzuweisen.

Die Möglichkeit "PureBasic - Compileroptionen - Benutze Icon" scheidet aus, weil der Anwender kein PureBasic hat.

Es gibt zwar auch die Möglichkeit ein Icon zur Laufzeit anzuzeigen, aber es soll dauerhaft angezeigt werden und nicht nur während der Laufzeit.

Beispiel:

Code: Alles auswählen

If OpenWindow(0,300,200,400,300,#PB_Window_SystemMenu,"Icontest")
   If LoadImage(0,"IconTest.ico")
      SendMessage_(WindowID(),#WM_SETICON,#False,UseImage(0))
   EndIf
   Delay(3000)
EndIf
Das ist also also auch nicht die Lösung.

Gibt es eine Möglichkeit, ein beliebiges Icon in einer bestehenden EXE-Datei so zu speichern (als Ressource?Icon 0?), dass diese es dann dauerhaft als Standard-Icon anzeigt?

Verfasst: 24.11.2005 05:06
von xperience2003
mit reshack kannste icons von bestehenden exen ändern, löschen und austauschen
...erm...und noch einiges mehr =)

http://www.angusj.com/resourcehacker/

edit:
..mist, thema verfehlt

Verfasst: 24.11.2005 08:35
von Blackskyliner
Kann man nicht der EXE sagen nimm von der EXE da das Icon?? also als Icon einfafch mal versuchen die EXE anzugeben und da drinne mal nach nem Icon suchen, müsste gehn...

Verfasst: 24.11.2005 10:43
von ts-soft
Mit folgenden 3 API-Befehlen kann man das Icon, ab W2K, austauschen:

Code: Alles auswählen

BeginUpdateResource_
UpdateResource_
EndUpdateResource_
Weitere Infos in der MSDN, z.B. hier: http://msdn.microsoft.com/library/defau ... source.asp
Mit dem Reshacker ist das aber einfacher.

Verfasst: 24.11.2005 15:06
von Tracker
@xperience2003
Ich kenne den Ressourcehacker, man kann damit englische Oberflächen eindeutschen und vieles mehr.
Ich suche aber eine Möglichkeit in PureBasic, ein Icon fest zuzuweisen.

@Blackskyliner
Ich habe mir mit einem Hex-Editor eine EXE-Datei angesehen, aber keine Infos gefunden, wo das Icon als Ressource gespeichert ist.

@ts-soft
Der Ansatz mit den API-Befehlen klingt interessant.
Ich werde mal versuchen herauszufinden, wie sie funktionieren und welche Parameter ich übergeben muss.

Wenn du ein funktionsfähiges Codebeispiel hast, würde ich mich freuen, wenn du es hier posten könntest.

Am Wochenende werde ich entscheiden, ob ich ein Standard-Icon in der EXE fest vorgebe, dann geht es eben nicht anders oder ob ich eine Möglichkeit finde diese Funktionalität noch in mein Programm einzubauen.

Verfasst: 24.11.2005 15:31
von ts-soft
Ein Beispiel findeste im CodeArchiv, das bezieht sich zwar auf eine Manifest, aber im Grunde ist das ja egal: http://www.purearea.net/pb/CodeArchiv/W ... _to_Exe.pb
weil nur die Parameter andere sind

Verfasst: 25.11.2005 02:32
von Tracker
@ts-soft
Ich kriegs nicht auf die Reihe :(

Das Beispiel in Deinem Link greift auf eine filename.exe zu.

Ich bastele mir in PureBasic zum Testen also einen Dreizeiler wie z.B:

Code: Alles auswählen

If OpenWindow(0,300,200,400,300,#PB_Window_SystemMenu,"Icontest")
      Delay(3000)
EndIf
Diese filename.pb compiliere ich zur filename.exe, also ein leeres Fenster, das für 3 Sekunden angezeigt wird und dem ich mit einem anderen Programm ein Icon zuweisen möchte.

Jetzt hätte das Programm noch gerne eine Datei filename.exe.manifest.
Ein Manifest ist, soweit ich weiß, eine XML-Datei, die der filename.exe sagt, dass sie auf die Version 6 der comctl32.dll zugreifen soll und die ist für Steuerelemente (Gadgets) auf der Oberfläche zuständig (auch für das SystemIcon???).
Ich hoffe, ich habe das richtig interpretiert.

Weil bei deinem Programm kein Manifest dabei ist, habe ich testweise die xp.res aus den PureBasic\Compilers Verzeichnis in filename.exe.manifest umbenannt.

Dein Programm verwendet Speicherbefehle, um den Aufruf der API-Befehle vorzubereiten.
Mit #RT_MANIFEST = 24 kann ich gar nichts anfangen. Wofür ist das gut?

Wenn ich dein Programm jetzt starte, wird es zwar ausgeführt, aber die filename.exe, die vorher noch funktioniert hat, erzeugt jetzt eine Fehlermeldung "Dies ist keine gültige Windows-Anwendung".

Ich muss ehrlich sagen, mir fehlen die Grundkenntnisse, um die Funktionsweise nachzuvollziehen.
Warum läuft das Programm nicht, wie binde ich das Icon ein und brauche ich die Manifest-Datei überhaupt dafür?

Ich hätte nie gedacht, dass es so ein Problem ist, ein Icon in ein fertiges EXE-Programm einzubinden.
Gibt es denn nirgends ein funktionierendes PureBasic-Beispiel, das dies ermöglicht und das ich einigermaßen verstehen kann?
Trotzdem, danke für den Link.

Verfasst: 25.11.2005 13:06
von ts-soft
Die manifest brauchste natürlich nicht dazu. Du willst doch ein Icon austauschen, mußte also die Konstante für Icons verwenden. Wenn das Icon sich im Speicher befindet, die Speicheradresse und grösse des Icons angeben. Die Exe, in der das Icon rein soll darf natürlich nicht ausgeführt werden, ansonsten wird eine tmporäre Datei mit dem Icon erzeugt.
Es gibt so gut wie keine Anwendungfälle für den Icon-Austausch, warum soll es also leicht sein?
Das Icon im Fenstertitel kannste ja leicht austauschen, das im Explorer angezeigte eben nicht, weil dies einen Eingriff in die Exe erfordert. Sowas bereitet immer Probleme, bei mir würde sich zum Beispiel ZoneAlarm bei sowas melden. Ich hab auch nur einen Lösungsweg aufgezeigt, weil es Grundsätzlich möglich ist. Ich glaube nicht, das ich sowas jemals brauchen werde.

Verfasst: 26.11.2005 01:29
von Tracker
Wie man ein Icon einer bestehenden EXE-Datei zuweist ist die einzige Info, die ich noch brauche, um mein Programm fertigzustellen.

Ich werde morgen mal meine VisualBasic-Bücher durchforsten.
Vielleicht finde ich darin ein Beispiel, das ich an PureBasic anpassen oder Hintergrundwissen, wie ich das Problem lösen kann.

API-Aufrufe und die zu übergebenden Parameter sind für mich immer noch böhmische Dörfer.

Wenn ich es bis morgen Abend nicht schaffe, weise ich ein Standard-Icon zu.
Dann können die Anwender eben kein eigenes Icon wählen.
Ist auch nicht weiter schlimm.
Hauptsache der Rest des Programms funktioniert.

Mal sehen, wie ich damit weiter komme :roll:

Verfasst: 26.11.2005 22:55
von Tracker
Das Ändern des Icons von einem bestehenden EXE-Programm scheint wirklich ein größeres Problem zu sein.

In meinen VisualBasic-Büchern steht höchstes, wie man das Icon ausliest, nicht jedoch, wie man es aktualisiert.
Ich habe auch mal in meinen API-Büchern (Win32API professionell, Win32 Puzzle Buch und einer Uralt-Ausgabe von Programmer's Guide to the Windows API) rumgestöbert. Leider ohne Erfolg.

Im englischen PureBasic-Forum habe ich folgenden Eintrag gefunden, der sich mit diesem Thema beschäftigt:
http://forums.purebasic.com/english/vie ... hange+icon

Darin gibt es auch das folgende Beispiel von Traumatic, das bei NT, 2000 und XP funktionieren soll:
http://forums.purebasic.com/english/vie ... hp?t=14019

Mit dieser Funktion soll es gehen:

Code: Alles auswählen

Procedure.l ChangeIcon(iconFileName.s, exeFileName.s)
Ich habe versucht die Funktion folgendermaßen aufzurufen:

Code: Alles auswählen

IconFileName$ = "Test.ico"
ExeFileName$  = "Testprogramm.exe"
Ergebnis.l = ChangeIcon(IconFileName$, ExeFileName$)
Leider funktioniert der Code bei mir nicht :(
Nach der Ausführung ist die Zieldatei Testprogramm.exe kaputt!

Das Beispiel hätte mir aber sowieso nichts gebracht, ich bei meinem Programm auch Windows 98 unterstützen will.

Laut Forumseintrag von Traumatic gibt es für Window98 jedoch keinen API-Befehl der das Icon aktualisieren kann.
Er verweist auf Dokumentationen von Microsoft, wie man sowas manuell lösen könnte.
Leider gibt es dafür jedoch kein Codebeispiel und mit meinen Einsteigerkenntnissen kann ich das Problem nicht lösen.
Ich gebe auf :cry:

Ich weise meinem Programm jetzt ein Standardicon zu verzichte auf die Aktualisierung.
Schade, dass es nicht geklappt hat.
Trotzdem, danke für eure Tipps :)