ICONs fressen sich irgendwie fest



  • Hallo zusammen.

    Ich muss in einem Programm das Icon ändern.

    Das Programm ist Multilingual mit DLL´s gelöst.
    Wenn ich jetzt das ICOn ersetze und die DLL1 neu lade, wird das ICON im Programm oben links ersetzt. Das ICON im Tray welches aber auf die gleiche ID zugreift bleibt erhalten.

    In den DLL2,DLL3 für die anderen Sprachen sind auch Icons. Wenn ich die Sprache auf ändere bleibt das ICON oben rechts.

    Was mir auch aufgefallen ist, wenn ich ein neues Icon erstelle und es so wie das alte nenne, dann macht die Windoof vorschau das alte ICON als Symbol?!?

    Wenn ich das Programm starte und unten in der Taskleiste mit der rechten Maustaste klicke, dann kommt ein ganz ein altes ICOn welches ich durchs testen mal irgendwo eingefügt habe. ich komm aber nimmer hin.

    Das mit den DLL´s ist so gelöst, das eine DLL geladen wird und dann wird daraus ein ResourceHandle erstellt.

    Kann mir evtl. jemand Durchblick geben wie das gemacht ist?



  • Keiner eine IDEE? 😕


  • Mod

    Mir ist nicht klar ob Du das zur Laufzeit meinst oder grundsätzlich zwischen zwei Programm aufrufen.

    Zur Laufzeit nützt das nachträgliche ändern der DLL nichts mehr. Denn wenn LoadIcon/LoadImage ausgeführt wurde liegen die Icon Daten in interne Form vor. Die DLL wird dann nicht mehr benötigt.
    Dann müssen alle stellen in denen Icon Handles weitergegeben werden auch über die Änderung informiert werden.

    Da das Tray dynamisch ist, kann ich mir also nicht vorstellen, das dies über die Laufzeit hinweg gecached wird.

    Das der Explorer einen Icon Cache hat und der Desktop auch ist bekannt. Das die Änderung des Inhaltes eines Icons wohl selten ist, wird dies durch den Icon Cache nicht bemerkt. Das hat performance Gründe für den Explorer.

    PS: Ansonsten wenn es Windof ist, warum beschäftigst Du Dich damit. Arbeite doch mit Sachen die nicht doof sind. SCNR



  • Vielen Dank für deine Antwort.

    Hmm naja Windoof bleibt Windoof 🙂
    Ich muss mich damit beschäftigen, da ich es für dei Arbeit benötige. Wenn ich es kann macht es bestimmt spass damit was zu machen, doch aktuell habe ich noch große Probeme damit und tu mir echt richtig schwer.

    Ich mein grundsätlich zwischen den zwei Programm aufrufen.

    Also eigentlich wird von mir folgende Lösung verlangt:
    Es soll ein ICON im Installationsordner abgelegt werden und darauf soll das Programm dann zugreifen. Das ganze soll nicht mehr DLL abhängig sein.

    Ich kann mir aber nicht vorstellen wie das Funktionieren soll denn in der
    "Projekt.cpp" wird das Handle aus der DLL geladen und gesetzt.

    Später in der "ProjektDLG.cpp" wird dann das ICON ohne spezielle Handleübergabe gesetzt "LoadIcon(UINT)". Das UINT wird immer von der DLL die in der Projekt.cpp geladen wird genommen und gesetzt. Wie du schon sagtest wenn ich später dann die DLLs, ändert das nix am ICON obwohl ich zum Test in die anderen DLLs ein anderes ICON eingefügt habe.

    Wie kann ich denn die ICONS unabhängig von den DLLs setzen?

    Vielen lieben Dank für eure Hilfe



  • Vielleicht hilft das Löschen des Icon-Caches: %USERPROFILE%\AppData\Local\IconCache.db .


  • Mod

    @MFC_TRAINEE: Ich verstehe in keiner Weise was Du meinst mit "aus der CPP laden"?
    Ich lade x verschiedene Icons im TRay. Dynamisch. Da ist nichts in einem Cache...
    Das Icon, dass mit LoadIcon geladen wird und im Tray für die Anzeige vorgesehen wird, das wird auch angezeigt. Wenn das Programm es ändern will geschieht das.



  • Danke für eure Antworten.

    Sorry ich hab noch kaum Erfahrung und drücke mich vll etwas umständlich aus.

    Also Visual Studio und MFC erstellt ja eine projekt.cpp und eine projektDlg.cpp.

    Wenn das Programm gestartet wird werden erst alle Funktionen der projekt.cpp aufgerufen dann die der projektdlg.cpp.

    in der projekt.cpp wird ein handle mit daten der DLL in eine Variable gespeichert und dann mit einer Funktion gesetzt. Später in der projektDlg.cpp wird dann mit LoadIcon das Icon welches sich in der DLL ist gesetzt mit der Funktion "LoadIcon(UINT)" ohne Angabe eines Handles.

    Ich würde jetzt einfach gern ein ICON setzen welches sich z.b. beim Pfad C:\Benutzer\Desktop\einicon.ico befindet. Geht das irgendwie? Also damit da Icon nicht aus der DLL genommen wird?



  • LoadImage sollte dein Problem lösen mit dem laden des icon aus einer Datei



  • Vielen Dank für deinen Tip!

    Ich versuche das gerade zu verstehen. Auf MSDN verstehe ich es noch nicht so richtig wo ich da den Pfad angben muss.

    Beim googeln hab ich das gefunden:
    http://www.cpp-tutor.de/mfc/mfc/kap7/tut/tut3.htm

    Das werde ich morgen probieren.


  • Mod

    Entweder in LoadImage.
    Oder wenn die date in die EXE eingebeutet ist hast Du eine RC Datei.



  • Danke nochmal,

    aber in der .rc ist doch nur die ID und der Pfad zum Icon angeben?



  • Vielen Dank an alle!

    Ich hab das jetzt soweit hinbekommen.

    Jetzt hab ich nur noch 2 kleine Fragen auf die ich noch nicht richtig komme.

    In jeder DLL gibt es eine ABOUTBOX. Wie kann ich hier sagen, dass er das Icon immer aus der einen Datei laden soll?

    Wie wird denn im Code die Überschrift bzw. der Name des Dialogfensters gespeichtert.

    Danke vielmals!!! 🙂

    *HAPPY*


  • Mod

    Der name ist auch in der RC-Datei.

    Icons in einem Dialog kann man auch per WM_SETICON (kleines icon in der Caption) oder per STM_SETICON setzen (Icon im Diaogfeld.

    Wie wäre es mal mit etwas Grundlagen lesen?



  • Ich nehme deinen Appel an, doch:
    Ja ich lese Grundlagen und ich lese wirklich viel.
    Hab das Buch C++ in 21 Tagen durchgemacht doch so spezielle Sachen werden irgendwie nicht behandelt. Da steht zwar wie man ein ICON ändert aber halt nicht von solchen Funktionen.


  • Mod

    "C++ in 21 Tagen"?
    Das hört sich nach C++ lernen an, aber nicht nach Windows API...



  • Sorry, Visual C++ ist auf MFC abgestimmt...

    Aber das Programm an dem ich arbeite ist irgendwie anderst. Es greift auf .xmc Dateien zu usw. Das kann ich alles einfach noch nicht und weiß auch nicht wie ich mir das aneignen soll.

    Das der Name in der .rc Datei normal steht ist mir klar doch hier mit den DLL´s ist das irgendwie anderst gemacht. Denn in den Stringtabellen finde ich kein ToolName doch der das wird verwendet. Ich versuche gerade den Code zu analysieren doch das ist nicht so einfach.


Anmelden zum Antworten