{"id":408,"date":"2009-09-05T10:52:18","date_gmt":"2009-09-05T08:52:18","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=408"},"modified":"2009-09-05T09:18:23","modified_gmt":"2009-09-05T07:18:23","slug":"crash-durch-unsachgemaessen-umgang-mit-pretranslatemessage","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2009\/09\/05\/crash-durch-unsachgemaessen-umgang-mit-pretranslatemessage\/","title":{"rendered":"Crash durch unsachgem\u00e4\u00dfen Umgang mit PreTranslateMessage"},"content":{"rendered":"<p>Neulich bei einem Codereview, lief mir Code in den beiden nachfolgenden Formen \u00fcber meinen Monitor:<\/p>\n<pre lang=\"cpp\">BOOL CMyDialog::PreTranslateMessage(MSG *pMsg)\r\n{\r\n    \/\/ Translate Messages (ON_KEYDOWN -&gt; ON_COMMAND)\r\n    TranslateAccelerator(m_hWnd,m_hAccel,pMsg);\r\n    \/\/ Let the ToolTip process this message.\r\n    m_tooltip.RelayEvent(pMsg);\r\n    return __super::PreTranslateMessage(pMsg);\r\n}<\/pre>\n<p>&#8211;\u00a0bzw. \u00a0&#8211;<\/p>\n<pre lang=\"cpp\">BOOL CMyWnd::PreTranslateMessage(MSG *pMsg)\r\n{\r\n\u00a0 BOOL bResult = __super::PreTranslateMessage(pMsg);\r\n  DoSomething();\r\n\u00a0 return bResult;\r\n}<\/pre>\n<p>Sieht OK aus, aber hier tritt ein grunds\u00e4tzliches Problem auf:<\/p>\n<p>In beiden Funktionen wird evtl. eine Nachricht behandelt. Allerdings wird in diesem Fall nicht umgehend die Funktion verlassen. Durch das Behandeln der Nachricht kann n\u00e4mlich das Fenster\/Objekt, zu dem <em>PreTranslateMessage<\/em> geh\u00f6rt, bereits\u00a0zerst\u00f6rt sein. In diesem Fall kehrt <em>PreTranslateMessage<\/em> zur\u00fcck und der <em>this<\/em> Zeiger ist bereits ung\u00fcltig.<\/p>\n<p>Es ist also imminent wichtig in dem Moment in dem erkannt wird, dass die Nachricht behandelt wurde, auch umgehend die Funktion mit TRUE zu verlassen und keine weitere Memberfunktion oder gar Membervariable mehr zu nutzen. Beides k\u00f6nnte zu einem \u00fcblen Crash f\u00fchren.<\/p>\n<p>Der korrekte Code s\u00e4he also so aus:<\/p>\n<pre lang=\"cpp\">BOOL CMyDialog::PreTranslateMessage(MSG *pMsg)\r\n{\r\n  \/\/ Translate Messages (ON_KEYDOWN -&gt; ON_COMMAND)\r\n  if (TranslateAccelerator(m_hWnd,m_hAccel,pMsg))\r\n    return TRUE;\r\n  \/\/ Let the ToolTip process this message.\r\n  m_tooltip.RelayEvent(pMsg);\r\n  return __super::PreTranslateMessage(pMsg);\r\n}<\/pre>\n<p>&#8211; oder &#8211;<\/p>\n<pre lang=\"cpp\">BOOL CMyWnd::PreTranslateMessage(MSG *pMsg)\r\n{\r\n\u00a0 if (__super::PreTranslateMessage(pMsg))\r\n    return TRUE;\r\n  DoSomething();\r\n\u00a0 return FALSE;\r\n}<\/pre>\n<p lang=\"cpp\">PS: Beide Codeteile wurden durch Crashdumps aus <a href=\"https:\/\/winqual.microsoft.com\/\">WinQual <\/a>gefunden. Regelm\u00e4\u00dfig, alle 2 Monate schaue ich mir Dumps an, von den Top-Crashes, die dort verzeichnet sind, und mache entsprechende Code-Reviews.<br \/>\nDer erste Code, stammte aus einem speziellen nicht modalen Dialog, der durch Dr\u00fccken bestimmter Tastenkombinationen geschlossen und zerst\u00f6rt wurde.<br \/>\nDer zweite Code stammte aus einem Popup-Fenster, dass auch durch Mausaktivit\u00e4ten oder Tastendr\u00fccke zerst\u00f6rt wurde.<br \/>\nIch kann jedem nur raten WinQual auch zu nutzen, es dient der Qualtit\u00e4tssicherung und man findet viele kleine Bugs, die manchen User \u00e4rgern, die aber nie sonst gemeldet w\u00fcrden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Neulich bei einem Codereview, lief mir Code in den beiden nachfolgenden Formen \u00fcber meinen Monitor: BOOL CMyDialog::PreTranslateMessage(MSG *pMsg) { \/\/ Translate Messages (ON_KEYDOWN -&gt; ON_COMMAND) TranslateAccelerator(m_hWnd,m_hAccel,pMsg); \/\/ Let the ToolTip process this message. m_tooltip.RelayEvent(pMsg); return __super::PreTranslateMessage(pMsg); } &#8211;\u00a0bzw. \u00a0&#8211; BOOL CMyWnd::PreTranslateMessage(MSG *pMsg) { \u00a0 BOOL bResult = __super::PreTranslateMessage(pMsg); DoSomething(); \u00a0 return bResult; } Sieht OK &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2009\/09\/05\/crash-durch-unsachgemaessen-umgang-mit-pretranslatemessage\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eCrash durch unsachgem\u00e4\u00dfen Umgang mit PreTranslateMessage\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,11,4,3],"tags":[38,352,136],"class_list":["post-408","post","type-post","status-publish","format-standard","hentry","category-c","category-debugging","category-mfc","category-programmieren","tag-debuggen","tag-mfc","tag-qualitaetssicherung"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/408","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=408"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/408\/revisions"}],"predecessor-version":[{"id":517,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/408\/revisions\/517"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=408"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=408"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=408"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}