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 aufTForm::WM_QueryEndSession(Msg); // TForm statt TForm1bis 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 stehtHeader
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 stehenwas 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 werdenbis 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 lautetExitWindows(0,0)trotzdem nochmal vielen vielen Dank an alle die mir geholfen haben
es funktioniert jetzt alles tadellosMfg
Daniel