{"id":254,"date":"2008-05-21T20:06:51","date_gmt":"2008-05-21T18:06:51","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=254"},"modified":"2008-05-18T20:32:16","modified_gmt":"2008-05-18T18:32:16","slug":"cb_addstringcb_insertstringcbs_uppercaseunicodeconst-string-pointer-das-grosse-erstaunen","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2008\/05\/21\/cb_addstringcb_insertstringcbs_uppercaseunicodeconst-string-pointer-das-grosse-erstaunen\/","title":{"rendered":"CB_ADDSTRING\/CB_INSERTSTRING+CBS_UPPERCASE+Unicode+const String Pointer == das gro\u00dfe Erstaunen"},"content":{"rendered":"<p>Es gibt immer wieder Momente in denen einen die Win32 API in gr\u00f6\u00dftes Erstaunen versetzt.<br \/>\nMeistens ist dies allerdings in diesen Momenten nichts positives. Das zweite Erstaunen folgt, dann wenn man in der MSDN nachliest und das Verhalten\u00a0 als dokumentiert vorfindet. Meistens endet solch eine Kette dann in einem Kopfsch\u00fctteln und dem Gedanken: Das darf doch gar nicht sein.<\/p>\n<p>Genug der langen Vorworte:<\/p>\n<ul>\n<li>Gegeben ein normales MFC Projekt. (WinAPI pur tut es auch \ud83d\ude09 )<\/li>\n<li>Ein Dialog<\/li>\n<li>Darin eine Combobox als Dropdown mit Eingabem\u00f6glichkeit<\/li>\n<li>Die Combobox wird mit einigen Variablen Werten gef\u00fcllt mit CComboBox::Addstring\/InsertString, was letzten Endes nur ein Wrapper f\u00fcr <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/bb775828(VS.85).aspx\">CB_ADDSTRING<\/a>\/<a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/bb775875(VS.85).aspx\">CB_INSERTSTRING<\/a> ist.<\/li>\n<li>Das ganze sieht also in <em>OnInitDialog<\/em> in etwa wie folgt aus<\/li>\n<\/ul>\n<pre lang=\"cpp\" line=\"1\">cb.AddString(CString(MAKEINTRESOURCE(IDS_DATA1)));\r\ncb.AddString(CString(MAKEINTRESOURCE(IDS_DATA2)));\r\ncb.AddString(CString(MAKEINTRESOURCE(IDS_DATA3)));\r\ncb.AddString(strSomeDynamicData);\r\ncb.InsertString(0,_T(\"\"));<\/pre>\n<p>Alles OK&#8230; Als letztes noch den Stil <em>CBS_UPPERCASE<\/em> dazu &#8211; weil hier eben nur Eingaben in Gro\u00dfbuchstaben erlaubt sein sollen und Sinn machen &#8211; und&#8230; <em><strong>Peng!<\/strong><\/em><br \/>\nDas Programm schmiert ab. \ud83d\ude2e<\/p>\n<p>Was ged&#8217;n hier ab Alder \u2753<\/p>\n<p>In den tiefen des Aufrufs von <em>cb.InsertString(0,_T(&#8222;&#8220;)); <\/em>schmiert mein Programm ab. UAE<br \/>\nNun aber doch gro\u00dfes Erstaunen, denn der selbe Code funktioniert in einem MBCS Programm.<br \/>\nEs liegt eindeutig an der Nutzung von <em>CBS_UPPERCASE<\/em> und Unicode.<\/p>\n<p>Jetzt habe ich schon gedacht einen Bug in <em>Vista<\/em> und <em>XP <\/em>gefunden zu haben, denn auf beiden schmiert bersagter Code ab. Und wahrscheinlich ist es auch ein Bug! Aber das genauere Nachlesen der MSDN belehrt mich eines besseren. Dieses d\u00e4mliche Verhalten ist dokumentiert, zumindest f\u00fcr <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/bb775828(VS.85).aspx\">CB_ADDSTRING <\/a>(der Zusatz fehlt in der <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/bb775875(VS.85).aspx\">CB_INSERTSTRING<\/a>\u00a0Doku):<\/p>\n<blockquote><p><strong>Comclt32.dll version 5.0 or later:<\/strong> If <strong>CBS_LOWERCASE<\/strong> or <strong>CBS_UPPERCASE<\/strong> is set, the Unicode version of <strong>CB_ADDSTRING<\/strong> alters the string. If using read-only global memory, this causes the application to fail. \u2757<\/p><\/blockquote>\n<p>Unfassbar! Die Nachricht ist dabei selbst so beschrieben, wie es sich jeder vern\u00fcnftige Entwickler auch denkt <strong>und vor allem erwartet<\/strong>, eben mit einem <em><strong>LPCTSTR<\/strong><\/em>:<\/p>\n<pre lang=\"cpp\" line=\"1\">lResult = SendMessage(      \/\/ returns LRESULT in lResult\r\n     (HWND) hWndControl,    \/\/ handle to destination control\r\n     (UINT) CB_ADDSTRING,  \/\/ message ID\r\n     (WPARAM) wParam,      \/\/ = 0; not used, must be zero\r\n     (LPARAM) lParam       \/\/ = (LPARAM) (LPCTSTR) lParam;\r\n);<\/pre>\n<p>Aber was n\u00fctzt schon ein vern\u00fcnftiger Gedanke eines Entwicklers wenn es um das irrwitzige Eigenleben der Win32 API geht.<br \/>\nUnd denke nie einen Bug gefunden zu haben, bevor Du nicht jede Zeile der MSDN studiert hast \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Es gibt immer wieder Momente in denen einen die Win32 API in gr\u00f6\u00dftes Erstaunen versetzt. Meistens ist dies allerdings in diesen Momenten nichts positives. Das zweite Erstaunen folgt, dann wenn man in der MSDN nachliest und das Verhalten\u00a0 als dokumentiert vorfindet. Meistens endet solch eine Kette dann in einem Kopfsch\u00fctteln und dem Gedanken: Das darf &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2008\/05\/21\/cb_addstringcb_insertstringcbs_uppercaseunicodeconst-string-pointer-das-grosse-erstaunen\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eCB_ADDSTRING\/CB_INSERTSTRING+CBS_UPPERCASE+Unicode+const String Pointer == das gro\u00dfe Erstaunen\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,3,2],"tags":[370,61,89],"class_list":["post-254","post","type-post","status-publish","format-standard","hentry","category-c","category-programmieren","category-windows-api","tag-c","tag-winapi","tag-windows"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/254","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=254"}],"version-history":[{"count":0,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/254\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=254"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=254"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=254"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}