<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Problem beim Beenden der Anwendung]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Problem beim Beenden meiner Anwendung.<br />
Ich erstelle ganz normal ein Fenster mit einer WNDPROC Callback funktion.<br />
in der WinMain habe ich dann noch meinen MessageLoop.</p>
<pre><code class="language-cpp">bool bRet;
	//while (GetMessage(&amp;msg, NULL, 0, 0)) 
	while( (bRet = GetMessage( &amp;msg, NULL, 0, 0 )) != 0)
	{
		if (bRet == -1)
		{
			// handle the error and possibly exit
			WrtLog(&quot;GETMESSAGE RETURNED -1\n&quot;);
		}
		else
		{
			TranslateMessage(&amp;msg); 
			DispatchMessage(&amp;msg); 
		}
	}
    //...deinitialisieren sollte hier passieren
    return (int) msg.wParam;
</code></pre>
<p>Da es sich um eine Hintergrundanwendung handelt, wird diese nicht von Hand beendet, sondern in der Regel durch Windows aufgefordert sich zu beenden.</p>
<p>Nun zum Problem. Wenn ich die Anwendung über Fenster schließen beende, läuft alles glatt. Meine Fenster-Callback-Funktion erhält irgendwann WM_CLOSE sendet darauf DestroyWindow, und auf WM_DESTROY wird mit PostQuitMessage(0) das Beenden veranlasst (GetMessage == 0).</p>
<pre><code class="language-cpp">LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	//int wmId, wmEvent;
	//PAINTSTRUCT ps;
	//HDC hdc;

	switch (message) 
	{
	/*case WM_PAINT:
		hdc = BeginPaint(hWnd, &amp;ps);
		// TODO: Fügen Sie hier den Zeichnungscode hinzu...
		EndPaint(hWnd, &amp;ps);
		break;*/
	case WM_DESTROY:
		PostQuitMessage (0);
		WrtLog(&quot;GOT WM DESTROY\n&quot;);
		return 0 ;
	case WM_QUIT:
		GetTime(MsgBuf);
		WrtLog(&quot;Shutting down on WM_QUIT...\n&quot;);
		MessageBox(NULL,&quot;QUIT&quot;,&quot;QUIT&quot;,MB_OK);
		break;
	case WM_CLOSE:
		WrtLog(&quot;GOT WM CLOSE\n&quot;);
		DestroyWindow(hWnd);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
</code></pre>
<p>Wenn ich nun aber einfach Windows herunterfahre bzw den Benutzer abmelde erhalte ich keine der Nachrichten. Also weder WM_CLOSE oder WM_DESTROY.<br />
Das is ja soweit auch ok. Wahrscheintich sendet Windows sofort ein WM_QUIT, oder?<br />
Das Problem is nur, dass der Messageloop scheinbar nicht durch GetMessage == 0 abgebrochen wird.<br />
Alles was ich danach ausführen lassen möchte (diverse Timer Killen und in ein Logfile schreiben) wird nicht mehr ausgeführt. Warum ist mir absolut nicht klar.<br />
Kann mir mal jemand einen Rat geben? Mir kommt das so vor, als wird das Programm rabiat gekillt, und nicht sauber beendet. Ich weiß aber nicht, wie ich das genauer überprüfen kann. Ein WM_QUIT kann ich in der WNDPROC Funktion ja nicht mehr abfangen, weil die Nachrichtenschleife ja bei GetMessage==0 sofort beendet wird.<br />
Aber alles was hinter der Schleife kommt, wird nicht ausgeführt, also kann ich auch da nichts mehr abfangen.<br />
Ich bin ein wenig ratlos, vielleicht hat ja jemand ne Idee?</p>
<p>mfg</p>
<p>Markus</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/71682/problem-beim-beenden-der-anwendung</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Apr 2026 20:16:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/71682.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 20 Apr 2004 19:00:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem beim Beenden der Anwendung on Tue, 20 Apr 2004 19:00:18 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Problem beim Beenden meiner Anwendung.<br />
Ich erstelle ganz normal ein Fenster mit einer WNDPROC Callback funktion.<br />
in der WinMain habe ich dann noch meinen MessageLoop.</p>
<pre><code class="language-cpp">bool bRet;
	//while (GetMessage(&amp;msg, NULL, 0, 0)) 
	while( (bRet = GetMessage( &amp;msg, NULL, 0, 0 )) != 0)
	{
		if (bRet == -1)
		{
			// handle the error and possibly exit
			WrtLog(&quot;GETMESSAGE RETURNED -1\n&quot;);
		}
		else
		{
			TranslateMessage(&amp;msg); 
			DispatchMessage(&amp;msg); 
		}
	}
    //...deinitialisieren sollte hier passieren
    return (int) msg.wParam;
</code></pre>
<p>Da es sich um eine Hintergrundanwendung handelt, wird diese nicht von Hand beendet, sondern in der Regel durch Windows aufgefordert sich zu beenden.</p>
<p>Nun zum Problem. Wenn ich die Anwendung über Fenster schließen beende, läuft alles glatt. Meine Fenster-Callback-Funktion erhält irgendwann WM_CLOSE sendet darauf DestroyWindow, und auf WM_DESTROY wird mit PostQuitMessage(0) das Beenden veranlasst (GetMessage == 0).</p>
<pre><code class="language-cpp">LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	//int wmId, wmEvent;
	//PAINTSTRUCT ps;
	//HDC hdc;

	switch (message) 
	{
	/*case WM_PAINT:
		hdc = BeginPaint(hWnd, &amp;ps);
		// TODO: Fügen Sie hier den Zeichnungscode hinzu...
		EndPaint(hWnd, &amp;ps);
		break;*/
	case WM_DESTROY:
		PostQuitMessage (0);
		WrtLog(&quot;GOT WM DESTROY\n&quot;);
		return 0 ;
	case WM_QUIT:
		GetTime(MsgBuf);
		WrtLog(&quot;Shutting down on WM_QUIT...\n&quot;);
		MessageBox(NULL,&quot;QUIT&quot;,&quot;QUIT&quot;,MB_OK);
		break;
	case WM_CLOSE:
		WrtLog(&quot;GOT WM CLOSE\n&quot;);
		DestroyWindow(hWnd);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
</code></pre>
<p>Wenn ich nun aber einfach Windows herunterfahre bzw den Benutzer abmelde erhalte ich keine der Nachrichten. Also weder WM_CLOSE oder WM_DESTROY.<br />
Das is ja soweit auch ok. Wahrscheintich sendet Windows sofort ein WM_QUIT, oder?<br />
Das Problem is nur, dass der Messageloop scheinbar nicht durch GetMessage == 0 abgebrochen wird.<br />
Alles was ich danach ausführen lassen möchte (diverse Timer Killen und in ein Logfile schreiben) wird nicht mehr ausgeführt. Warum ist mir absolut nicht klar.<br />
Kann mir mal jemand einen Rat geben? Mir kommt das so vor, als wird das Programm rabiat gekillt, und nicht sauber beendet. Ich weiß aber nicht, wie ich das genauer überprüfen kann. Ein WM_QUIT kann ich in der WNDPROC Funktion ja nicht mehr abfangen, weil die Nachrichtenschleife ja bei GetMessage==0 sofort beendet wird.<br />
Aber alles was hinter der Schleife kommt, wird nicht ausgeführt, also kann ich auch da nichts mehr abfangen.<br />
Ich bin ein wenig ratlos, vielleicht hat ja jemand ne Idee?</p>
<p>mfg</p>
<p>Markus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/505561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/505561</guid><dc:creator><![CDATA[unmighty_markus]]></dc:creator><pubDate>Tue, 20 Apr 2004 19:00:18 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Beenden der Anwendung on Tue, 20 Apr 2004 19:25:40 GMT]]></title><description><![CDATA[<p>Mich wundert es zwar etwas, dass die Anwendung einfach gekillt wird, aber evtl. würde es dir helfen <a href="http://msdn.microsoft.com/library/en-us/sysinfo/base/wm_endsession.asp" rel="nofollow">WM_ENDSESSION</a> bzw. <a href="http://msdn.microsoft.com/library/en-us/sysinfo/base/wm_queryendsession.asp" rel="nofollow">WM_QUERYENDSESSION</a> abzufangen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/505573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/505573</guid><dc:creator><![CDATA[flenders]]></dc:creator><pubDate>Tue, 20 Apr 2004 19:25:40 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Beenden der Anwendung on Tue, 20 Apr 2004 22:50:45 GMT]]></title><description><![CDATA[<p>WM_QUIT ist nicht dazu da, um bearbeitet zu werden. Doku sagt dazu:</p>
<blockquote>
<p><strong>[WM_QUIT]</strong></p>
<p>Return Value<br />
This message does not have a return value, because it causes the message loop to terminate before the message is sent to the application's window procedure.</p>
</blockquote>
<p>Also entweder bei WM_DESTROY alles aufräumen oder in WinMain nach dem Austreten aus der Messageloop.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/505717</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/505717</guid><dc:creator><![CDATA[Christoph]]></dc:creator><pubDate>Tue, 20 Apr 2004 22:50:45 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Beenden der Anwendung on Wed, 21 Apr 2004 07:16:16 GMT]]></title><description><![CDATA[<p>ja eben. Also bezüglich der WM_QUIT Notification blick ich, was MSDN dazu sagt sowieso nicht ganz durch.<br />
Einmal heißt es da</p>
<blockquote>
<p>A window receives this message through its WindowProc function.</p>
</blockquote>
<p>womit ja mal eindeutig die Callback Funktion gemeint ist.<br />
...und weiter unten heißt es</p>
<blockquote>
<p>Return Value</p>
<p>This message does not have a return value, because it causes the message loop to terminate before the message is sent to the application's window procedure.</p>
<p>Remarks</p>
<p>The WM_QUIT message is not associated with a window and therefore will never be received through a window's window procedure. It is retrieved only by the GetMessage or PeekMessage functions.</p>
</blockquote>
<p>Also was denn nun?<br />
Naja abgesehen davon ist ja das gerade mein Problem, dass ich quasi nicht wirklich sauber aus dem Messageloop rauskomme und auch kein WM_DESTROY empfange wenn Windows runterfährt.</p>
<p>WM_ENDSESSION wäre einen Versuch Wert, aber laut MSDN</p>
<blockquote>
<p>The application need not call the DestroyWindow or PostQuitMessage function when the session is ending.</p>
</blockquote>
<p>...naja ich werd mal weiter schauen. Kann es sein, dass mein Fenster vielleicht irgendwie nicht korrekt registriert ist oder sowas? So das Windows es einfach ignoriert bzw übesieht ?</p>
<p>gruß</p>
<p>Markus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/505779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/505779</guid><dc:creator><![CDATA[unmighty_markus]]></dc:creator><pubDate>Wed, 21 Apr 2004 07:16:16 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Beenden der Anwendung on Wed, 21 Apr 2004 07:34:31 GMT]]></title><description><![CDATA[<p>Ich hatte eine Konsole für diverse Debuginformationen offen. Wahrscheinlich denkt sich Windows dann, dass es sich um eine Konsolenanwendung handelt und haut das Ding sofort aus dem Speicher. Es ist aber eine &quot;richtige&quot; Windowsanwendung.<br />
Wenn ich die Konsole mal weglasse, dann empfange ich zumindest schon mal WM_ENDSESSION, was vorher nich ging. Aber hinter dem Messageloop komme ich immer noch nicht an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/505790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/505790</guid><dc:creator><![CDATA[unmighty_markus]]></dc:creator><pubDate>Wed, 21 Apr 2004 07:34:31 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Beenden der Anwendung on Wed, 21 Apr 2004 12:34:00 GMT]]></title><description><![CDATA[<p>Ich habe das bei mir auch mal getestet und er kommt nicht hinter die Message-Loop wenn ich mich abmelde. Von WM_QUIT, WM_CLOSE und WM_DESTROY bekommt man auch nichts mehr mit - nur WM_QUERYENDSESSION und WM_ENDSESSION. D.h., wenn du noch was zu erledigen hast, dann must du das dort machen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/506039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/506039</guid><dc:creator><![CDATA[flenders]]></dc:creator><pubDate>Wed, 21 Apr 2004 12:34:00 GMT</pubDate></item></channel></rss>