Fenster mit SW_HIDE ruft keine Destruktoren und kein WM_DESTROY auf



  • Ich arbeite gerade an einem Programm, welches im Hintergrund laufen muss und Dateien auf Veränderung überprüft.
    Beim erstellen des Fensters benutze ich SW_HIDE, damit der Benutzer nichts vom Trubel mitbekommt, wenn das Programm allerdings beendet wird hatte ich erwartet, das WM_DESTROY aufgerufen wird oder wenigstens wie gewohnt alle Destruktoren aufgerufen werden.

    Das oben zu erwartende Verhaltensmuster zeigt sich allerdings nicht, wenn z.B. das Programm durch herunterfahren des Systems oder durch schließen im Taskmanager beendet wird. Was in meinem Programm die einzige Alternative zum schließen darstellt.

    Auf ein Fenster kann ich nicht verzichten, da ich FindWindow in manchen Fällen nutzen muss. Eine Lösung ohne Fenster kommt daher nicht in Betracht.

    Meine Fragen sind nun folgende:

    Ich habe bereits herausgefunden das ich nötige Aufräumarbeiten erledigen kann in dem ich WM_QUERYENDSESSION benutze(zumindest beim herunterfahren oder logout).
    Was mir allerdings komisch erscheint ist die Tatsache das keine Destruktoren aufgerufen werden, kann das Betriebsystem selbst ermitteln was freigegeben werden muss?
    Gibt es einen besseren Weg die nötigen Aufräumarbeiten zu erledigen?

    Allen schonmal einen guten Rutsch 🤡



  • Hi,

    wenn dein Proggie sowieso im Hintergrund läuft, wieso benötigst du ein Window?
    Warum schreibst Du es nicht als Dienst? Dies hat den Vorteil, dass Dein Programm automatisch vom BS informiert wird, wenn es beendet wird, ohne den Message-Mechanismus.

    Andererseits könntest Du für dein Hide-Window die Broadcast-Messages

    WM_SYSCOMMAND

    auswerten, die auf jedenfall gepostet wird.

    P.S.: Ein Dienst ist nur eine besondere Form einer Anwendung, nicht wirklich schwer zu realisieren.



  • Fängst du WM_CLOSE überhaupt ab?


  • Mod

    WM_CLOSE muss nicht abgefangen werden.
    Wenn DestroyWindiw aufgerufen wird, dann wird auch WM_DESTROY und WM_NCDESTROY versendet!

    Ich vermute eher, das DestroyWindow nicht aufgerufen wird.
    Wie wird das Fenster zerstört?


Anmelden zum Antworten