{"id":326,"date":"2008-11-16T16:17:47","date_gmt":"2008-11-16T15:17:47","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=326"},"modified":"2008-11-16T11:29:30","modified_gmt":"2008-11-16T10:29:30","slug":"cfiledialog-oeffnet-unter-umstaenden-nicht","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2008\/11\/16\/cfiledialog-oeffnet-unter-umstaenden-nicht\/","title":{"rendered":"CFileDialog \u00f6ffnet unter Umst\u00e4nden nicht"},"content":{"rendered":"<p>Ein Problem bei einem Kunden hat mich ins ungl\u00e4ubige Staunen getrieben.<br \/>\nWir haben in einem Einstellungsdialog ein Edit Control f\u00fcr einen Dateinamen. Dazu einen simplen Schalter mit dem man einen <em>CFileDialog <\/em>\u00f6ffnet und die Datei so ausw\u00e4hlen kann. Bei einem Kunden wollte aber der Dialog in einigen F\u00e4llen nicht \u00f6ffnen, der Klick auf den Schalter blieb ohne Wirkung. Da der entsprechende Code so simpel war, kam ein Programmfehler kaum in Frage.<\/p>\n<p>Nachdem ich mir einen Screenshot habe senden lassen, staunte ich nicht schlecht, denn ich konnte den Fehler mit gleichen Eingaben zuerst nicht nachvollziehen, denn ich nutzte Vista und der Kunde hatte XP SP2. Sobald ich aber unter XP die selben Vorgaben machte, trat der Fehler auch bei mir auf.<\/p>\n<p>Es scheint ein Bug in den Common Dialogs zu sein. Ist der Dateiname, den man im zweiten Parameter von <em>CFileDialog <\/em>angibt (vorschl\u00e4gt) in bestimmter Weise &#8222;ung\u00fcltig&#8220;, dann \u00f6ffnet der Dialog nicht. Der R\u00fcckgabewert ist <em>IDCANCEL (2) <\/em>und CommDlgExtendedError liefert <em>FNERR_INVALIDFILENAME<\/em>. Ung\u00fcltig ist aber fast zu viel gesagt, denn der Pfad enthielt an einer Stelle nur einfach 2 Backslashes statt einen, wie \u00fcblich.<\/p>\n<p>Einfach nachzuvollziehen mit dem folgenden Snippet:<\/p>\n<pre lang=\"cpp\">\/\/ Preset filename with a double backslash in the path:\r\n\/\/ C:\\TEMP\\\\Schrott.txt\r\nCFileDialog dlg(TRUE,_T(\"txt\"),_T(\"C:\\\\TEMP\\\\\\\\Schrott.txt\"),\r\n            OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,\r\n            _T(\"Text files|*.txt|All files|*.*||\"));\r\nINT_PTR iResult = dlg.DoModal();\r\nDWORD dwLastError = GetLastError();\r\nDWORD dwCommLastError = CommDlgExtendedError();\r\n\r\nCString strResult;\r\nstrResult.Format(_T(\"Returncode %d, Lasterror 0x%08X, CommLastError 0x%08X\"),\r\n            iResult,dwLastError,dwCommLastError);\r\nAfxMessageBox(strResult);<\/pre>\n<p>Eigentlich nur verwunderlich, denn der Name selbst mit doppelten Backslashes wird vom Dateisystem sonst \u00fcberall akzeptiert. Man kann eine Datei mit dem Namen \u00f6ffnen, lesen und schreiben. Nur <em>CFileDialog <\/em>mag ihn nicht. Oder besser der Standard-Common-File-Dialog\u00a0mag ihn nicht.<\/p>\n<p>Bleibt die Frage warum ich unter Vista den Fehler nicht bekam?<\/p>\n<p>Nutzt man VS-2008 und l\u00e4sst das Programm unter Vista laufen, dann ist auch alles wieder gut. Denn unter Vista benutzt Der <em>CFileDialog <\/em>ein neues Interface (<a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/bb776913.aspx\">Common Item Dialog<\/a>) und nicht mehr den normalen Common-File-Dialog. Die neuen in die MFC gewrappten Dateidialoge von Vista k\u00f6nnen mit dieser Vorgabe umgehen.<br \/>\nL\u00e4sst man das gleiche Programm wieder unter XP SP2 laufen, bekommt man den entsprechenden Fehler wieder, da in diesem Fall wieder die Standard-Common-Dialoge verwendet werden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ein Problem bei einem Kunden hat mich ins ungl\u00e4ubige Staunen getrieben. Wir haben in einem Einstellungsdialog ein Edit Control f\u00fcr einen Dateinamen. Dazu einen simplen Schalter mit dem man einen CFileDialog \u00f6ffnet und die Datei so ausw\u00e4hlen kann. Bei einem Kunden wollte aber der Dialog in einigen F\u00e4llen nicht \u00f6ffnen, der Klick auf den Schalter &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2008\/11\/16\/cfiledialog-oeffnet-unter-umstaenden-nicht\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eCFileDialog \u00f6ffnet unter Umst\u00e4nden nicht\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":[99,370,352,61],"class_list":["post-326","post","type-post","status-publish","format-standard","hentry","category-c","category-mfc","category-programmieren","category-windows-api","tag-bug","tag-c","tag-mfc","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\/326","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=326"}],"version-history":[{"count":0,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/326\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=326"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=326"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=326"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}