{"id":820,"date":"2011-06-25T18:46:47","date_gmt":"2011-06-25T16:46:47","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=820"},"modified":"2011-06-22T18:52:22","modified_gmt":"2011-06-22T16:52:22","slug":"getmodulefilename-liefert-nicht-exakt-den-namen-der-exedll-datei-wie-er-auf-der-platte-steht","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2011\/06\/25\/getmodulefilename-liefert-nicht-exakt-den-namen-der-exedll-datei-wie-er-auf-der-platte-steht\/","title":{"rendered":"GetModuleFileName liefert nicht exakt den Namen der EXE\/DLL Datei wie er auf der Platte steht"},"content":{"rendered":"<p>Wir haben ein St\u00fcck Code, dass verhindern soll, dass ein Programm zweimal gestartet werden kann.<br \/>\nDieser basiert auf einem Mutex und einer\u00a0Memory Mapped\u00a0File, mit der man sich auch das Fenster-Handle einer bereits gestarteten Instanz besorgen kann.<\/p>\n<p>Nun gelang es einem unserer H\u00e4ndler aber dennoch dieses Programm zweimal in einer Session zu starten und zwar auf folgendem Weg:<\/p>\n<ol>\n<li>Er startet die Software mit dem normalen Link auf dem Desktop, der durch das Installationsprogramm angelegt wurde.<\/li>\n<li>Er \u00f6ffnen eine Console mit CMD.EXE und wechselt in das Verzeichnis, gibt den Programmnamen ein und\u00a0das Programm startet\u00a0erneut. \ud83d\ude2e<\/li>\n<\/ol>\n<p>Die Ursache ist war wie folgt:<\/p>\n<ol>\n<li>Der Mutex den wir intern verwendet haben nutzte den Dateinamen der EXE. Der Name des Mutex wird unter Anderem auch durch <em>GetModuleFileName<\/em> ermittelt.<\/li>\n<li>Der Dateiname der EXE, wenn sie als Verkn\u00fcpfung gestartet wird ist &#8222;XYZ.exe&#8220; (so wie die Datei auch auf der Festplatte hei\u00dft) und das liefert auch <em>GetModuleFileName<\/em> als Ergebnis.<\/li>\n<li>Der Dateiname, den <em>GetModuleFileName<\/em> liefert, wenn man das Programm aus CMD.EXE startest ist exakt so wie man es eintippt, also z.B. &#8222;xyz.exe&#8220;. Erstaunlich.<\/li>\n<li>Da der <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms682411(VS.85).aspx\" target=\"_blank\">Mutex <\/a>einen Namen case sensitiv behandelt (was ich nicht vermutet h\u00e4tte und erst mit staunenden Augen nachgelesen habe), wurde das bereits gestartete Programm nicht erkannt und eine zweite Instanz gestartet.<\/li>\n<\/ol>\n<p>Was schreiben wir uns also hinter die L\u00f6ffel f\u00fcr die Zukunft:<br \/>\na) <em>GetModuleFileName<\/em> liefert nicht den &#8222;exakten&#8220; Dateinamen (obwohl ich es anders erwartet h\u00e4tte)!<br \/>\nb) Mutexe sind case sensitiv wie auch Events (obwohl ich hier eine Behandlung wie bei einem Dateinamen erwartet habe)!<br \/>\nc) Manche Erwartungen tr\u00fcgen&#8230; \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wir haben ein St\u00fcck Code, dass verhindern soll, dass ein Programm zweimal gestartet werden kann. Dieser basiert auf einem Mutex und einer\u00a0Memory Mapped\u00a0File, mit der man sich auch das Fenster-Handle einer bereits gestarteten Instanz besorgen kann. Nun gelang es einem unserer H\u00e4ndler aber dennoch dieses Programm zweimal in einer Session zu starten und zwar auf &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2011\/06\/25\/getmodulefilename-liefert-nicht-exakt-den-namen-der-exedll-datei-wie-er-auf-der-platte-steht\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eGetModuleFileName liefert nicht exakt den Namen der EXE\/DLL Datei wie er auf der Platte steht\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":[99,370,136,61,89],"class_list":["post-820","post","type-post","status-publish","format-standard","hentry","category-c","category-programmieren","category-windows-api","tag-bug","tag-c","tag-qualitaetssicherung","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\/820","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=820"}],"version-history":[{"count":0,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/820\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=820"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=820"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=820"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}