{"id":169,"date":"2007-12-09T18:22:11","date_gmt":"2007-12-09T17:22:11","guid":{"rendered":"http:\/\/blog.m-ri.de\/index.php\/2007\/12\/09\/die-unsitte-postquitmessage-zum-beenden-eines-programmes-zu-verwenden\/"},"modified":"2008-01-10T14:33:15","modified_gmt":"2008-01-10T13:33:15","slug":"die-unsitte-postquitmessage-zum-beenden-eines-programmes-zu-verwenden","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2007\/12\/09\/die-unsitte-postquitmessage-zum-beenden-eines-programmes-zu-verwenden\/","title":{"rendered":"Die Unsitte PostQuitMessage zum Beenden eines Programmes zu verwenden!"},"content":{"rendered":"<p>Immer wieder lese ich\u00a0Postings in <a href=\"http:\/\/www.c-plusplus.de\/forum\">http:\/\/www.c-plusplus.de\/forum<\/a> die es <em>anpreisen <\/em>ein Programm mit <em>PostQuitMessage <\/em>zu beenden, genau so unsinnig wie <em>WM_QUIT <\/em>zu versenden.\u00a0<\/p>\n<p>Das ist nat\u00fcrlich Unfug! Sicherlich wird ein Programm durch PostQuitMessage beendet, aber warum?<br \/>\nWeil die Nachrichtenschleife verlassen wird und letzten Endes WinMain verlassen wird. Dies f\u00fchrt dazu, dass die darunter liegenden CRT Routinen irgendwann <em>ExitProcess <\/em>ausf\u00fchren. BTW: W\u00fcrde hier nur ein der CRT einfacher return erfolgen, dann w\u00fcrde der Prozess weiterleben, wenn noch ein einziger anderer Thread aktiv w\u00e4re.<\/p>\n<p>Das brutale Verlassen f\u00fchrt aber letzten Endes auch dazu, dass erst ExitProcess brutal alle Fenster aufr\u00e4umt. D.h.\u00a0kein Fenster wird <em>normal <\/em>zerst\u00f6rt, kein <em>WM_DESTROY <\/em>bzw. <em>WM_NCDESTROY <\/em>wird empfangen. D.h. alle normalen Prozesse, die dem Aufr\u00e4umen und Freigeben von Ressourcen dienen, werden au\u00dfer Kraft gesetzt.<br \/>\nJa und sicherlich gibt <em>ExitProcess <\/em>Speicher frei, die der Prozess alloziert hat, auch einige Handles k\u00f6nnen freigegeben werden, aber nicht alle (z.B. benamte Mutexe und\u00a0Semaphoren).<\/p>\n<p>Bei einem Mikey Mouse Win32 API Programm mag dies kein Problem sein, denn hier gibt es keine Ressourcen, die Prozess\u00fcbergreifend ein Leak verursachen w\u00fcrden, oder eine Ressource blockieren w\u00fcrden.<br \/>\nAber grunds\u00e4tzlich w\u00fcrde ich es unterlassen. Jede andere Library, die man verwendet, jedes externe Control, dass man einbindet k\u00f6nnte genau auf dieses entscheiden <em>WM_DESTROY <\/em>angewiesen sein um Ressourcen freizugeben, die ein System blockieren k\u00f6nnten. Solange man nicht 100%ig wei\u00df wie die benutzen Bibliotheken arbeiten, ja nicht einmal detailliert wei\u00df wie COM und die CRT Handles behandeln w\u00fcrde ich grunds\u00e4tzlich abraten ein Programm einfach mit <em>ExitProcess <\/em>zu verlassen, genau so wie ich abrate <em>TerminateProcess <\/em>zu verwenden.<\/p>\n<p>Der richtige Weg ist und bleibt es das\/alle Main Window(s) zu zerst\u00f6ren und entsprechend dann (im <em>WM_DESTROY <\/em>Handler) <em>PostQuitMessage <\/em>(<em>AfxPostQuitMessage<\/em>) auszuf\u00fchren. Durch das Zerst\u00f6ren des Hauptfensters werden nat\u00fcrlich alle enthaltenen Child-Windows mit zerst\u00f6rt. Alle Fenster bekommen damit die Chance hinter sich aufzur\u00e4umen und Ressourcen frei zu geben.<\/p>\n<p>PS: Aber solche Unsitten lassen sich kaum ausmerzen. Genauso wenig wie die Unsitte einen <em>HINSTANCE <\/em>Wert einfach durch Aufruf von <em>GetModuleHandle(NULL) <\/em>zu bestimmen&#8230; Auch eine Unsitte, die wohl niemand mehr ausmerzen wird.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Immer wieder lese ich\u00a0Postings in http:\/\/www.c-plusplus.de\/forum die es anpreisen ein Programm mit PostQuitMessage zu beenden, genau so unsinnig wie WM_QUIT zu versenden.\u00a0 Das ist nat\u00fcrlich Unfug! Sicherlich wird ein Programm durch PostQuitMessage beendet, aber warum? Weil die Nachrichtenschleife verlassen wird und letzten Endes WinMain verlassen wird. Dies f\u00fchrt dazu, dass die darunter liegenden CRT Routinen &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2007\/12\/09\/die-unsitte-postquitmessage-zum-beenden-eines-programmes-zu-verwenden\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eDie Unsitte PostQuitMessage zum Beenden eines Programmes zu verwenden!\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":[30,4,3,2],"tags":[352,74,61],"class_list":["post-169","post","type-post","status-publish","format-standard","hentry","category-c","category-mfc","category-programmieren","category-windows-api","tag-mfc","tag-unsitten","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\/169","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=169"}],"version-history":[{"count":0,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/169\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=169"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=169"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=169"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}