{"id":643,"date":"2010-07-21T19:35:35","date_gmt":"2010-07-21T18:35:35","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=643"},"modified":"2010-07-26T15:54:59","modified_gmt":"2010-07-26T14:54:59","slug":"bug-in-der-mfc-von-vc-2010-in-cimagelistdrawindirect","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2010\/07\/21\/bug-in-der-mfc-von-vc-2010-in-cimagelistdrawindirect\/","title":{"rendered":"Bug in der MFC von VC-2010 in CImageList::DrawIndirect"},"content":{"rendered":"<p>Die Funktion <em>CImageList::DrawIndirect <\/em>der <em>MFC-10 <\/em><\/p>\n<pre lang=\"cpp\">BOOL CImageList::DrawIndirect(CDC* pDC, int nImage, POINT pt, SIZE sz,\r\n    POINT ptOrigin, UINT fStyle = ILD_NORMAL, DWORD dwRop = SRCCOPY,\r\n    COLORREF rgbBack = CLR_DEFAULT, COLORREF rgbFore = CLR_DEFAULT,\r\n    DWORD fState = ILS_NORMAL, DWORD Frame = 0,\r\n    COLORREF crEffect = CLR_DEFAULT);<\/pre>\n<p>hat einen massiven Bug: Sie funktioniert einfach nicht.<\/p>\n<p>Der Unsinn, der sich eingeschlichen hat, liegt in der \u00fcberschriebenen Funktion<\/p>\n<pre lang=\"cpp\">BOOL CImageList::DrawIndirect(IMAGELISTDRAWPARAMS* pimldp);<\/pre>\n<p>die durch die oben genannte Variante aufgerufen wird. Denn hier\u00a0<em>cbSize <\/em>von <em>IMAGELISTDRAWPARAMS <\/em>nicht mehr in allen F\u00e4llen auf einen korrekten Wert gesetzt. Die Folge <em>cbSize <\/em>enth\u00e4lt Garbage und der Aufruf von ImageList_DrawIndirect geht in die Hose!<br \/>\nSowohl in <em>VC-2005<\/em> als auch <em>VC-2008<\/em> wurde in dieser Funktion explizit der cbSize Member \u00fcberschrieben, je nach dem ob <em>ComCtl 6.0<\/em> oder h\u00f6her von der Anwendung benutzt wird.<\/p>\n<p>Auch das ist ein Bug, denn hierdurch wird evtl. ein korrekt gesetzter cbSize Wert mit <em>IMAGELISTDRAWPARAMS_V3_SIZE<\/em> (pre <em>IE 5.01<\/em> d.h. <em>_WIN32_IE &lt; 0x0501<\/em>) \u00fcberschrieben und damit vergr\u00f6\u00dfert vergr\u00f6\u00dfert. Dadurch kann es zu Zugriffsfehlern kommen oder zu unerw\u00fcnschten Seiteneffekten.<br \/>\n(siehe <a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/322713\/bug-in-cimagelist-drawindirect\">https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/322713\/bug-in-cimagelist-drawindirect<\/a>)<\/p>\n<p>Also haben die Entwickler scheinbar die Zuweisung von <em>pimldp-&gt;cbSize = sizeof(IMAGELISTDRAWPARAMS)<\/em> entfernt! Allerdings haben Sie dabei vergessen in der anderen Funktion nun <em>cbSize <\/em>korrekt zu initialisieren!<\/p>\n<p>Wir haben also wieder mal einen Fall von: <em>Let us fix one thing and break others&#8230;<\/em><\/p>\n<p>Das Gemeine an der Sache ist, dass dieser Bug noch vor RTM bekannt war:<br \/>\n<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/543108\/bug-in-cimagelist-drawindirect\">https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/543108\/bug-in-cimagelist-drawindirect<\/a><br \/>\nNur ist er nicht mehr gefixed worden!<\/p>\n<p>PS: Nat\u00fcrlich f\u00e4hrt die eigene Software mit der <em>MFC-10<\/em> auch gegen die Wand, wenn man die <em>CImageList::DrawIndirect(IMAGELISTDRAWPARAMS* pimldp)<\/em> Variante verwendet und selbst <em>cbSize <\/em>nicht initialisiert, was ein ordentlicher Entwickler aber sicherlich nicht vergisst! \ud83d\ude09<\/p>\n<p><strong>Wem es m\u00f6glich ist, sollte bei den beiden Connect Eintr\u00e4gen Abstimmen und diesen Bug als wichtig kennzeichnen!<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Funktion CImageList::DrawIndirect der MFC-10 BOOL CImageList::DrawIndirect(CDC* pDC, int nImage, POINT pt, SIZE sz, POINT ptOrigin, UINT fStyle = ILD_NORMAL, DWORD dwRop = SRCCOPY, COLORREF rgbBack = CLR_DEFAULT, COLORREF rgbFore = CLR_DEFAULT, DWORD fState = ILS_NORMAL, DWORD Frame = 0, COLORREF crEffect = CLR_DEFAULT); hat einen massiven Bug: Sie funktioniert einfach nicht. Der Unsinn, der &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2010\/07\/21\/bug-in-der-mfc-von-vc-2010-in-cimagelistdrawindirect\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eBug in der MFC von VC-2010 in CImageList::DrawIndirect\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,172],"tags":[99,370,352,228],"class_list":["post-643","post","type-post","status-publish","format-standard","hentry","category-c","category-mfc","category-programmieren","category-vs2010","tag-bug","tag-c","tag-mfc","tag-vc-express"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/643","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=643"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/643\/revisions"}],"predecessor-version":[{"id":644,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/643\/revisions\/644"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=643"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=643"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=643"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}