Ein EXE-Icon ersetzen
-
Ich möchte mein Exe-Icon gern verändern können. Dazu will ich aus einer
anderen Anwendung, oder auch aus meiner selbst (falls möglich) ein Icon
auslesen.Hier ein Versuch, der aber so nicht direkt von mir ist. Ich habe mit
dem Code etwas Probleme, da ich nicht verstehe wie ich hier das gewählte
Icon richtig angeben soll "IDI_ICON", oder mit MAKEINTRESOURCE??).HMODULE hLibrary; HRSRC hResource; HGLOBAL hResourceLoaded; LPBYTE lpBuffer; DWORD dErrorCode; hLibrary = LoadLibrary("C:\\test.exe"); if (NULL != hLibrary) { //??? IDI_ICON2 ist in test.exe vorhanden, aber wie spreche ich das Icon an? hResource = FindResource(hLibrary, "IDI_ICON2"), RT_ICON); if (NULL != hResource) { hResourceLoaded = LoadResource(hLibrary, hResource); if (NULL != hResourceLoaded) { lpBuffer = (LPBYTE) LockResource(hResourceLoaded); if (NULL != lpBuffer) { // do something with lpBuffer here } } }else{ dErrorCode = GetLastError(); } FreeLibrary(hLibrary); }
Muss ich nicht jetzt noch UpdateResource aufrufen?
-
Hat denn wirklich niemand eine Idee wie man das machen kann?
Och kommt schon
-
also was jetzt genau? das exe icon ändern während die exe selbst ausgeführt wird? oder eine icon resoruce aus einem anderen modul laden?
-
Das ist mir eigentlich fast egal. Hauptsache ich kann das Haupticon der
eigenen Exe austauschen gegen ein anderes. Welchen Weg ich da nehme ist
mir relativ egal. Ich liefere nicht zwingend alle icons in meiner eigenen
exe mit.Warum gibts sowas nicht schon in den FAQ?
-
vielleicht mal einfach "resourcen hacker" in Suchmaschine eingeben?
mfg f.-th.
-
Und was bring ihm das, wenn er keine Ahnung hat wie er das Icon ersetzen soll?
mal wieder,
qualitätslos
-
@qualitätslos: was ist 'resourcen hacker'
Futter für die Suchmaschine?
Ein PC-Freak der hackt?
Ein Programm mit dem man Resourcen bearbeiten kann?@all: es gab mal Zeiten da hatte jeder gute C/C++ -Compiler ein Tool, was
z.B. Icon's auch nachträglich manipulieren konnte, an Bord.mfg f.-th.
-
f.-th. schrieb:
es gab mal Zeiten da hatte jeder gute C/C++ -Compiler ein Tool, was z.B. Icon's auch nachträglich manipulieren konnte, an Bord.
Und warum glaubst Du sollte das heute nicht mehr so sein? Öffne doch die EXE mit VS als Resource... dann hast Du genau das was Du suchst...
-
Auf meinen Code kann wohl niemand helfen eingehen, oder
Das geht mir irgendwie voll an meinem Ursprungsthema vorbei
-
Du willst das Icon Deiner laufenden EXE austauschen? Das geht aus prinzip schon nicht, da Du ja die EXE nicht schreiben kannst, während dem diese ausgeführt wird.
Wenn dann musst Du es aus einem anderen Programm heraus machen; und ja: Du musst natürlich UpdateResource ausführen, wenn Du was speichern willst...
Der Vorgang ist wie folgt:
- Use the LoadLibrary function to load the executable file Hand.exe.
- Use the FindResource and LoadResource functions to locate and load the dialog box resource.
- Use the LockResource function to retrieve a pointer to the dialog box resource data.
- Use the BeginUpdateResource function to open an update handle to Foot.exe.
- Use the UpdateResource function to copy the dialog box resource from Hand.exe to Foot.exe.
- Use the EndUpdateResource function to complete the update.
-
Hallo und vielen Dank!
Ich habe jetzt testweise die AboutBox ersetzt und das funktioniert ja wirklich super.
Sobald ich das aber für Icons ummünze, wird in der zu verändernden Datei
ein Icon unter "0" angelegt. Das zu ersetzende Icon lautet aber "1031".Ich suche vergeblich, wie ich mitgeben kann an unter welcher ID das Icon
in der zu verändernden Datei geschrieben werden kann.
-
Hier mein Code:
HGLOBAL hResLoad; // handle to loaded resource HMODULE hExe; // handle to existing .EXE file HRSRC hRes; // handle/ptr. to res. info. in hExe HANDLE hUpdateRes; // update resource handle LPVOID lpResLock; // pointer to resource data BOOL result; // Load the .EXE file that contains the icon you want to copy. hExe = LoadLibrary("c:\\hand.exe"); if (hExe == NULL) { MessageBox("Could not load exe."); } // Locate the icon resource in the .EXE file. hRes = FindResource(hExe, MAKEINTRESOURCE(7), RT_ICON); //7->1031 ist es in meiner exe if (hRes == NULL) { MessageBox("Could not locate icon."); } // Load the icon into global memory. hResLoad = LoadResource(hExe, hRes); if (hResLoad == NULL) { MessageBox("Could not load icon."); } // Lock the icon into global memory. lpResLock = LockResource(hResLoad); if (lpResLock == NULL) { MessageBox("Could not lock icon."); } // Open the file to which you want to add the icon resource. hUpdateRes = BeginUpdateResource("c:\\foot.exe", FALSE); if (hUpdateRes == NULL) { MessageBox("Could not open file for writing."); } // Add the icon resource to the update list. result = UpdateResource(hUpdateRes, // update resource handle RT_ICON, // change icon resource "7", // Icon nr 7->"1031" ist es im ResHacker. geschrieben wird aber 7->"0"??? MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), // neutral language lpResLock, // ptr to resource info SizeofResource(hExe, hRes)); // size of resource info. if (result == FALSE) { MessageBox("Could not add resource."); } // Write changes to FOOT.EXE and then close it. if (!EndUpdateResource(hUpdateRes, FALSE)) { MessageBox("Could not write changes to file."); } // Clean up. if (!FreeLibrary(hExe)) { MessageBox("Could not free executable."); }
-
Du solltest MAKEINTRESOURCE(7) verwenden anstelle von "7"...
-
Hi, das habe ich jetzt auch schon probiert. Es wird aber dennoch
das Icon 7->"0" anstelle von 7->"1031" geschrieben.Ich kann aber keinen weiteren Fehler meinerseits finden, zumal das ganze eh ja
nur minimal für Icons umgeändert wurde.Es gibt in beiden Anwendungen unter "Icon" den Ordner "7" und darunter
das eigentliche Icon "1031". Nur wirds halt nie ersetzt, sondern ein Icon "0"
zusätzlich geschrieben
-
Ich muss sagen: Ich verstehe es nicht ganz, was denn sein "soll" und was jetzt "ist"...
-
Jetzt habe ich eine Icon-Resource die heißt "0", die muss aber "1031" heißen!
Im Reshacker werden doch Ordner angezeigt. Mit der "7" bei UpdateRessource()
gebe ich offenbar nur den ORDNER an. Unterhalb des Ordners ist aber das ICON
mit "1031" bezeichnet (und genau da kommt "0" an statt "1031".Verstanden?
-
Muss sagen das Thema is interessant. Komme aber auch nicht zu nem update des Icon!! Gleiches Problem hier!!
Aber Motto des Forum: Irgendwer hat immer eine Antwort
-
Hallo,
deine 1031 bekommst du wenn du statt MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL) MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN) in der UpdateResource() Methode/Funktion verwendets.
Des Weiteren muss ich mich einem der Vorredner anschließen, schreibe
in der Methode ebenfalls "7" in MAKEINTRESOURCE(7) um!Und falls es nciht ganz einleuchtet
result = UpdateResource(hUpdateRes, // update resource handle RT_ICON, // change icon resource MAKEINTRESOURCE(7), // Icon nr 7->"1031" ist es im ResHacker. geschrieben wird aber 7->"0"??? MAKELANGID(LANG_GERMANL, SUBLANG_GERMAN), // neutral language lpResLock, // ptr to resource info SizeofResource(hExe, hRes)); // size of resource info.
So wäre es korrekt, aber SummaSummarum würde cih sagen das dein Code dennoch nicht funktioniert, aber versuchs einfach mal so.
Zu mindest sollte dein erwünschtes Ergebnis nun in der 1031 sein.Grüße