Stack Überlauf bei wm_queryendsession



  • Hallo an alle hier im Forum

    ich habe ein kleines Problem mit wm_queryendsession und zwar läuft meine Anwendung im Hindergrund und soll nun von Windows beendet werden, es funktioniert alles einwandfrei nur wenn ich die wm_queryendsession frage von windows bekomme gebe ich True zurück das meine Anwendung geschlossen werden soll, doch es kommt zum Stack Overflow.

    Ich weis mir einfach keinen Rat mehr, vielleicht kann mir jemand von euch helfen, ich bin für jeden Tip Dankbar 🙄

    void __fastcall TForm1::WM_QueryEndSession(TMessage &Msg){;
    try{
    Msg.Result=1;
    }
    __finally
    {
    TForm1::WM_QueryEndSession(Msg);
    }
    }
    


  • Ja, was soll denn sonst passieren? Du fängst die Nachricht ab und gibst sie weiter. Was zum Abfangen und weiterleiten führt, was zum Abfangen und weiterleiten führt, was zum... Das führt dann schlußendlich zum stack overflow.



  • Hallo Joe_M.

    Du hast recht der Stack wird zwischen WM_Queryendsession und WM_Endsession voll geschrieben und in dieser Zeit fange ich WM_Queryendsession ab und gebe es weiter, das reicht für einen Stackoverflow 🙄

    Aber wie kann ich diese Zeit überbrücken so das ich WM_Queryendsession abfange und bestätigen kann, eine möglichkeit habe ich gefunden (ist weniger professionel) und zwar

    Sleep(...)
    

    es muss doch noch eine andere Möglichkeit geben oder ..??? 😕



  • Hallo

    Wobei "Weiterleiten" nicht ganz den Kern trifft. Weiterleiten würde den Aufruf von zum Beispiel SendMessage bedeuten. Du aber rufst einfach die eigene Funktion unendlich oft auf. Das kannst du auch einfach sein lassen, das hat keinen Sinn. Entferne den Teil im finally-Block ganz.
    Oder ruf wenigstens die Methode noch für die Basisklasse auf

    TForm::WM_QueryEndSession(Msg); // TForm statt TForm1
    

    bis bald
    akari



  • Hallo akari

    Vielen Dank für deine Hilfe hat aber auch leider nichts gebracht (bin langsam am verzweifeln) 😞

    Mit

    TForm::WM_QueryEndSession(Msg);
    

    bringt er mir ständig eine Fehlermeldung wie Undefiniertes Symbol "WM_QueryEndSession"
    obwohl ich alles im Header richtig deklariert habe
    und es auch so im Manual unter WM_Endsession steht

    Header

    public:		// Anwender-Deklarationen
            __fastcall TForm1(TComponent* Owner);
    Graphics::TIcon *TrayIcon;
    void __fastcall WM_TRAYICON(TMessage &Msg);
    
    protected:
    void __fastcall WM_QueryEndSession(TMessage &Msg);
    void __fastcall WM_EndSession(TMessage &Msg);
    
    public:
    void __fastcall Icon_Entfernen();
    void __fastcall Icon_Einfuegen();
    
    BEGIN_MESSAGE_MAP
     MESSAGE_HANDLER(WM_TRAYICON_MELDUNG,TMessage, WM_TRAYICON)
     MESSAGE_HANDLER(WM_QUERYENDSESSION, TMessage, WM_QueryEndSession)
     MESSAGE_HANDLER(WM_ENDSESSION, TMessage, WM_EndSession)
    END_MESSAGE_MAP (TForm)
    };
    

    und wenn ich alles im finally Block herraus nehme passiert garnichts
    Windows bleibt beim herrunterfahren bei meinen Prog stehen

    was soll ich denn nun machen bin ratlos und verzweifelt 🙄



  • Hallo

    Vielen Dank für deine Hilfe hat aber auch leider nichts gebracht (bin langsam am verzweifeln) 😞
    ...bringt er mir ständig eine Fehlermeldung wie Undefiniertes Symbol "WM_QueryEndSession"

    Weil TForm so eine Methode nicht hat. Mein Fehler, ich dachte du hättest diesen Code irgendwo kopiert und dass wäre das passenste.

    Wie bereits schon erwähnt must du die Message auch gar nicht weiterleiten. Das ganze kannst du also ersatzlos streichen. Statt desen must du wie du hier nachlesen kannst einen sinnvollen Wert zurückgeben. Und das geht so

    Msg.Result = true; // Windows darf beendet werden
    Msg.Result = false; // Windows darf nicht beendet werden
    

    bis bald
    akari



  • Hallo

    Ich hab mein Problemchen 😋 gelöst
    es stand ja alles in der MSDN (man hätte ich ja auch gleich
    drauf kommen können 🙄 )
    es lag nur an einer Zeile und die lautet

    ExitWindows(0,0)
    

    trotzdem nochmal vielen vielen Dank an alle die mir geholfen haben
    es funktioniert jetzt alles tadellos

    Mfg
    Daniel


Anmelden zum Antworten