{"id":49,"date":"2007-03-26T18:49:50","date_gmt":"2007-03-26T16:49:50","guid":{"rendered":"http:\/\/blog.m-ri.de\/index.php\/2007\/03\/26\/vista-beendet-programme-auch-wenn-wm_queryendsession-false-returniert\/"},"modified":"2007-03-26T18:52:29","modified_gmt":"2007-03-26T16:52:29","slug":"vista-beendet-programme-auch-wenn-wm_queryendsession-false-returniert","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2007\/03\/26\/vista-beendet-programme-auch-wenn-wm_queryendsession-false-returniert\/","title":{"rendered":"Vista beendet Programme auch wenn WM_QUERYENDSESSION FALSE returniert"},"content":{"rendered":"<p>Jeder kennt die nette Nachricht <em>WM_QUERYENDSESSION <\/em>die einem mitteilt, dass das System herunter gefahren wird, oder der Benutzer sich abmeldet.<\/p>\n<p>Und wir alle sind auch einfach gew\u00f6hnt <em>FALSE <\/em>zu returnieren wenn wir das nicht wollen und damit <strong>waren <\/strong>wir sicher\u00a0das <em>WM_ENDSESSION <\/em>mit <em>FALSE <\/em>gesendet wird und das System nicht herunterf\u00e4hrt. Ja! Richtig gelesen <strong>waren!<\/strong><\/p>\n<p>Das hat sich mit Vista nun auch ge\u00e4ndert. Wird im lParam Bit <em>ENDSESSION_CLOSEAPP (0x1)<\/em> gesetzt, dann spielt es keine Rolle wie das Programm es gerne h\u00e4tte. Die Applikation soll und muss beendet werden. D.h. die Applikation muss auch mit dem Zustand zurecht kommen, dass die Daten nicht gesichert sind, bzw. eben mit dem Zustand, der uns veranlasst hat <em>FALSE<\/em> zu returnieren.<br \/>\nDies war bisher ausgeschlossen. Deshalb sollte man sich \u00fcber das Verhalten seines Programmes an dieser Stelle mal Gedanken machen.<\/p>\n<p>F\u00fcr MFC Anwender noch eine kleine Herausforderung denn <em>OnQueryEndSession <\/em>wird von der MFC ohne Parameter aufgerufen und ohne das Vista SDK ist nat\u00fcrlich <em>ENDSESSION_CLOSEAPP <\/em>nicht definiert<\/p>\n<p class=\"ccode\">#ifndef ENDSESSION_CLOSEAPP<br \/>\n#define ENDSESSION_CLOSEAPP 0x1<br \/>\n#endif<br \/>\n&#8230;<br \/>\nBOOL CMainFrame::OnQueryEndSession()<br \/>\n{<br \/>\n\/\/ Need to get the lParam value for this message to<br \/>\n\/\/ determine the reason of the shutdown<br \/>\nLPARAM lParam = AfxGetCurrentMessage()-&gt;lParam;<br \/>\nif (lParam &amp; ENDSESSION_CLOSEAPP)<br \/>\n{<br \/>\n\u00a0 \/\/ We are forced to exit here, the user want to close\u00a0the<br \/>\n\u00a0 \/\/ application, even if we loose data<br \/>\n\u00a0 OnForcedShutdown():<br \/>\n\u00a0 return TRUE;<br \/>\n}<br \/>\nelse<br \/>\n\u00a0 \/\/ do the default<br \/>\n\u00a0 return __super::OnQueryEndSession();<br \/>\n}<\/p>\n<p>BTW: Eine normale MFC Applikation ber\u00fccksichtigt dies nicht korrekt. Es wird der Status von allen Dokumenten gepr\u00fcft und evtl. einen entsprechender Dialog angezeigt, wenn eines der Dokumente nicht gespeichert ist. Wird aber die Anfrage mit <em>ENDSESSION_CLOSEAPP<\/em> gesendet, dann muss die Antwort in 5 Sekunden erfolgen. Einen Dialog anzuzeigen\u00a0bzw. Frage zu stellen wie es die Standardimplementierung macht, passt hier nicht!<\/p>\n<p>Man sollte sich unbedingt hier die Vista \u00c4nderungen zu Gem\u00fcte f\u00fchren und gegebenenfalls auch <em>ShutdownBlockReasonCreate<\/em> implementieren.<\/p>\n<p>Weitere Infos zu den \u00c4nderungen findet sich in der\u00a0aktuellen MSDN:<\/p>\n<ul>\n<li><a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/aa376890.aspx\">WM_QUERYENDSESSION<\/a><\/li>\n<li><a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/aa373651.aspx\">Guidelines for Applications<\/a><\/li>\n<li><a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/bb394721.aspx\">Shutdown Changes for Windows Vista<\/a><\/li>\n<li><a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/aa376877.aspx\">ShutdownBlockReasonCreate<\/a><\/li>\n<\/ul>\n<p>Anmerkung: Jeder der sich mit der Vista-Zertifizierung auseinandergesetzt hat wird erkannt haben, dass es sich bei dem hier beschriebenen\u00a0Verhalten um den Test Case 30 handelt, bzw. die Requirements, Reliability 3.1!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jeder kennt die nette Nachricht WM_QUERYENDSESSION die einem mitteilt, dass das System herunter gefahren wird, oder der Benutzer sich abmeldet. Und wir alle sind auch einfach gew\u00f6hnt FALSE zu returnieren wenn wir das nicht wollen und damit waren wir sicher\u00a0das WM_ENDSESSION mit FALSE gesendet wird und das System nicht herunterf\u00e4hrt. Ja! Richtig gelesen waren! Das &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2007\/03\/26\/vista-beendet-programme-auch-wenn-wm_queryendsession-false-returniert\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eVista beendet Programme auch wenn WM_QUERYENDSESSION FALSE returniert\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3,17,2],"tags":[358,61],"class_list":["post-49","post","type-post","status-publish","format-standard","hentry","category-programmieren","category-vista-2","category-windows-api","tag-vista","tag-winapi"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/49","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/comments?post=49"}],"version-history":[{"count":0,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/49\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=49"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=49"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=49"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}