Programmicon einer EXE-Datei ändern



  • Hi Leutz!

    Ich hab ein Problem, hab auch schon im Internet und im Forum gesucht aber nix wirklich brauchbares gefunden ausser ein Delphi-Sourcecode, der nicht richtig funktioniert, wenn man ihn in C umsetzt) 😞 ... naja es geht um folgendes:

    Ich möchte das Programmicon eines Windows-Programms mit einem anderen austauschen, das ich aus einer ICO-Datei lade. Bisher habe ich folgendes Probiert, weis aber nicht ob es überhaupt läuft, weil mit UpdateRessource() immer den Fehler 87 (Wrong parameter value) zurückliefert.

    Hier mein bisheriger Versuch:

    string iconfile = "C:\\test\\myicon.ico";
    string exefile = "C:\\test\\myprog.exe";
    
    HANDLE hResLoad = (HICON)LoadImage (NULL, iconfile.c_str(), IMAGE_ICON, 0, 0, LR_LOADFROMFILE);
    //void* pResLock = LockResource(hResLoad) ;
    //if(pResLock == (void*)NULL) printf("error 4\n");
    void* ico_data = GlobalLock(hResLoad);
    
    HANDLE hResUpdate = BeginUpdateResource(exefile.c_str(), false);
    if(hResUpdate == (HANDLE)NULL) printf("error 5 %s\n", exefile.c_str());
    
    printf("GetLastError %d\n", (int)GetLastError());
    
    if(!UpdateResource(hResUpdate, RT_ICON, MAKEINTRESOURCE(0), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), ico_data, GlobalSize(ico_data)))
    {
         printf("error 6\n");
         printf("GetLastError %d\n", (int)GetLastError());
    
    }
    
    EndUpdateResource(hResUpdate, false);
    
    GlobalUnlock(ico_data);
    

    Könnt ihr mir sagen was falsch ist oder wie ich's besser machen kann??
    Ich dachte erst, man könnte das Icon einfach "Hardcoded" binär in die EXE reinkopieren, das geht aber nur, wenn man Icons mit derselben größe und derselben Farbtiefe benutzt. Ich möchte aber gerne alle möglichen Icons, also 16x16, 32x32 und 64x64 Pixel mit Farbtifen von 16 bis 256 Farben benutzen.

    Wäre cool wenn ihr eine Antwort parat hättet 😋

    Gruss,
    ~code_pilot



  • 1.) Du musst eine Resourcedatei erstellen
    2.) Das erste Icon darin ist das Icon der .Exe-Datei.

    Hier ein Text über Resourcedateien. Leider auf Englisch aber sehr gut.

    http://www.winprog.net/tutorial/resources.html



  • nein du hast mich falsch verstanden: Ich will nicht das Icon von einem Programm von mir ändern sondern das Programm-Icon IRGNDEINER EXE-Datei. Und das ist ja das erste Icon im Programm, klar als Ressource.

    Gruss,
    code_pilot



  • Ach so, vielleicht sollte ich demnächst genauer hinschauen...
    Ich hab das auch mal versucht, zwar nicht mit einem eigenen Programm, aber das lief auch darauf hinaus, dass man nur Icons von .Exe-Dateien austauschen konnte, wenn diese die selbe Größe und Farbtiefe hatten. Ansonsten stürzte die geänderte .Exe-Datei ab. Das problem ist, wenn in eine .Exe der Code veränder wird, sodass die Datei länger oder kürzer werden, stimmen die Sprungpunkte nicht mehr mit denen vom Compiler vorgesehenen überein und das Programm versucht an eine Stelle zu springen, wo keine neue Funktion, sondern z.B. nur eine Variable ist.
    Das Programm müsste alle Absoluten Referenzen des Binärcodes umschreiben. Das sollte aber so gut wie unmöglich sein, da ich nicht mal weis, ob man überhaupt zwischen absoluten und relativen Sprungpunkten und Referenzen unterscheiden kann.
    Ich fürchte, das geht aber über die einfache WinAPI hinaus und bringt dich praktisch dazu dich mit Binärcode zu beschäftigen.



  • lpData
    Pointer to the resource data to be inserted into the executable file. If the resource is one of the predefined types, the data must be valid and properly aligned. Note that this is the raw binary data stored in the executable file, not the data provided by LoadIcon, LoadString, or other resource-specific load functions.

    Nähere Infos / Tipps kann ich dir aber leider nicht geben 😞



  • Ja genau ... und den hol ich mir doch mit

    void* ico_data = GlobalLock(hResLoad);
    

    ~cp



  • Keine Ahnung - kenne mich da nicht besonder aus 🙄



  • keine idee mehr?? 😞



  • Hi,

    sorry lange her, aber das thema interessiert mich noch immer 🙂


Anmelden zum Antworten