Icon dynamisch ändern



  • Hallo zusammen,

    ich habe ein kleines MFC problem.

    Ich bekomme das Icon überall dynamisch mit LoadIcon geändert (Aboutbox, Systemtray, im Fenster selbst) indem ich einfach das icon austausche.
    in der .rc datei habe ich auch den pfad des neuen icons angegeben.

    Das Problem ist jetzt, wenn ich das icon austausche, muss ich neu compilieren damit die app.exe datei das neue icon bekommt.

    geht das irgendwie damit das programm das icon der .exe irgendwie ohne compilieren neu läd?


  • Mod

    Klar. Indem Du an allen Stellen, an der Du das Icon benutzen willst eben eine andere ID verwendest...



  • du hast mich falsch verstanden, das geht alles... ich tausche das icon im Programm wird alles geändert.

    Doch die application.exe im Windows-Explorer, hier wird das Icon nicht geändert, da bleibt das alte. Das hätte ich gern auch geändert.
    Und wie gesagt in der .rc datei hab ich das andere icon angegeben.

    wenn ich die projektmappe bereinige und neu compiliere dann hat application.exe das neue icon. Ich möchte eben das dies ohne compilieren funktioniert.



  • Windows (der Explorer) nimmt iirc das Icon mit der niedrigsten ID ...



  • Swordfish schrieb:

    Windows (der Explorer) nimmt iirc das Icon mit der niedrigsten ID ...

    das weiß ich, allerdings muss ich compilieren um das ergebnis zu bekommen, das möchte ich nicht!





  • hmm danke das müsste man probieren diese funktion einzusetzen jedesmal wenn das programm gestartet wird, weil dann würde sich das icon zumindest beim programmstart ändern... aber ich bibn mir nicht sicher welchen data type ich nehmen soll



  • also so richtig weiß ich nicht wie ich die funktion einsetzen soll...
    habs geschafft mein ganzen programm zu crashes und es startet nicht mal mehr wenn ich die funktion auskommentiere

    HANDLE test = BeginUpdateResource(_T("dasicon.ico"), 0);
    UpdateResource(test,RT_ICON, _T("dasicon.ico"), LANG_NEUTRAL,_T("dasicon.ico"), 0);
    

  • Mod

    Swordfish schrieb:

    UpdateResource()?

    Keine guteIdee in Zeiten von UAC...



  • funktioniert das überhaupt?

    es geht darum ich hab ein programm gschrieben von dem es verschiedene versionen gibt.

    eine blaue, eine rote, und eine gelbe.

    der einzige unterschied ist der name, eine andere dll wird geladen und eben das icon.

    ich will jetzt aber nicht jedesmal das icon ändern und dann compilieren sonder das icon der .exe welches im windows explorer angezeigt wird soll eben auch von einer datei geladen werden die in der gleichen ebene wie die .exe liegt.


  • Mod

    Dann lass, das doch durch den Installer machen. Du kannst das Icon für eine Verknüpfung ja selbst bestimmen.

    Ansonsten hast Du da keine Chance... Die Exe wird immer das Icon bebkommen, dass der Explorer in der exe als erstes findet.

    Nachrag: Oder bau einen Bootstraper, der immer variiert und immer die gleiche Core-DLL benutzt.



  • wie kann ich das durch den installer machen? ich benutze den nsi installer. mir ist da nichts bekannt wie ich das icon der exe ändern soll.



  • Martin Richter schrieb:

    Swordfish schrieb:

    UpdateResource()?

    Keine guteIdee in Zeiten von UAC...

    Steh' g'rad auf der Leitung?


  • Mod

    Eine EXE befindet sich normlerweise in enem Verzeichnis das Schreibgeschützt ist!
    Zudem hat selbst ein Admin user keine Rechte auf das C:\Programme Verzeichnis, außer das Programm läuft elevated.

    Wir soll da bitte UpdateResource funktionieren?
    Alles was eine Exe beim "Kunden" modifiziert ist keine gute Idee.

    Weiterhin würde es eine bestehende Signatur zerstören. Wie sollte man also z.B, einen "Windows compatible" Test bestehen?

    Für "Mickeymaus-Programme-Programmierer" mag das wurscht sein. Mir wäre es das nicht... 😉



  • Danke, machte eben einen Seitwärtsschritt 😉



  • hmm heißt das jetzt ich habe keine chance das zu ändern? bei der installation vielleicht? habe aber bei nsis nix dazu gefunden.

    UpdateResource geht eh nicht da:

    lpData [in, optional]
    Type: LPVOID

    The resource data to be inserted into the file indicated by hUpdate. 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 to be stored in the file indicated by hUpdate, not the data provided by LoadIcon, LoadString, or other resource-specific load functions. All data containing strings or text must be in Unicode format. lpData must not point to ANSI data.

    Aber würde mich über hilfe dennoch sehr sehr freuen denn irgendwie muss das doch zu machen sein?!?



  • dynamic schrieb:

    UpdateResource geht eh nicht da:

    Geht nicht, da keine Zugriffsrechte, wie Martin klargestellt hat. Die Daten würde man eben nicht mit LoadIcon() sondern durch stinknormales binäres Dateieinlesen holen ...



  • aber das muss doch irgendwie anderst gehen?



  • hmm ok, wenn ich das so akzeptieren müsste dann ok

    kann ich aber das icon das in der taskbar erscheint zur laufzeit ändern? weil hier nimmt er auch das icon der exe...



  • mag mir keiner mehr helfen?


Log in to reply