{"id":71,"date":"2007-05-16T18:25:20","date_gmt":"2007-05-16T16:25:20","guid":{"rendered":"http:\/\/blog.m-ri.de\/index.php\/2007\/05\/16\/selbstgemachter-manifest-aerger\/"},"modified":"2008-04-29T08:20:42","modified_gmt":"2008-04-29T06:20:42","slug":"selbstgemachter-manifest-aerger","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2007\/05\/16\/selbstgemachter-manifest-aerger\/","title":{"rendered":"Selbstgemachter Manifest-\u00c4rger&#8230;"},"content":{"rendered":"<p>In dem <a target=\"_blank\" href=\"http:\/\/www.c-plusplus.de\">C++.de<\/a> Forum kam dieser Thread <a href=\"http:\/\/www.c-plusplus.de\/forum\/viewtopic-var-t-is-181577-and-highlight-is-.html\">Sehr spezielles Problem &#8211; (DLL + Manifest)<\/a>\u00a0auf!<\/p>\n<p>Man muss den Thread nicht ganz lesen, ich will hier eine kurze \u00dcbersicht geben, wie man ein Projekt verbiegen kann, dass es nur noch \u00c4rger macht, den man nur schwer (oder nach langem Suchen) in den Griff bekommt.<\/p>\n<p><strong>Urspr\u00fcngliches Problem:<br \/>\n<\/strong>Es ging mal wieder darum eine EXE so zu schreiben, dass Sie nicht von einer <em>VC-2005<\/em> Runtime Library Installation (CRT+MFC) abh\u00e4ngig ist. Es ging um ein spezielles Plugin (also eine DLL).<\/p>\n<p><strong>Die Empfehlung war, wie so oft bei Manifest Problemen:<\/strong><br \/>\nLinke sowohl CRT als auch MFC statisch.<\/p>\n<p><strong>Begr\u00fcndung:<\/strong><br \/>\nDie DLL ben\u00f6tigt keine weiteren DLLs oder Third Party Libs. Ist also mehr oder weniger standalone. Also warum noch zus\u00e4tzliche Abh\u00e4ngigkeiten schaffen. Auch wenn dies etwas mehr Hauptspeicher kostet, wenn andere Applikationen die 8.0 Runtime-Libs auch gleichzeitig verwenden k\u00f6nnen.<br \/>\nEs er\u00fcbrigt die Installation der VCRedist_x86.exe oder auch andere, komplexere Tricks wie die applikationslokale Installation der Runtime-Libs.<\/p>\n<p><strong>Folgeproblem:<\/strong><br \/>\nSowohl f\u00fcr die MFC als auch f\u00fcr die CRT wurde nun statisches Linken im Projekt eingestellt. Aber dennoch wurde weiterhin ein Manifest erzeugt, das die CRT anforderte.<br \/>\nDas erzeugte doch nun einiges R\u00e4tselraten bei mir. \ud83d\ude15<br \/>\nAuch die Projektdatei, die mir zugesandt wurde brachte auf den ersten Blick keinen Aufschluss \u00fcber das Problem.<br \/>\nWeitere Pr\u00fcfung mit <em>DUMPBIN <\/em>ergab, dass die Objekt Dateien alle mit einem Manifest Eintrag kompiliert wurden, oder in anderen Worten, das im Sourcecode ein <em>#pragma comment manifest <\/em>Eintrag drin steht.<\/p>\n<p><strong>L\u00f6sung:<\/strong><br \/>\nEinze kurze Recherche in der <em>crtdefs.h<\/em> ergab, dass die <em>#pragma<\/em> Eintr\u00e4ge f\u00fcr die Manifeste nur erzeugt werden wenn, <em>_DLL<\/em> definiert wird. Die Doku sagt klar:<\/p>\n<ol>\n<li>Das ist eine interne, vordefinierte Pr\u00e4prozessor Variable<\/li>\n<li>Diese ist nur bei den Kompileroptionen <em>\/MD<\/em> und <em>\/MDd<\/em> definiert<\/li>\n<\/ol>\n<p>Derjenige, der dieses Projekt erzeugt hat, hat auch die Pr\u00e4prozessor Variable <em>_DLL<\/em> vordefiniert. Das Resultat war nat\u00fcrlich, dass Manifest-Eintr\u00e4ge erzeugt wurden und weiterhin die CRT-DLLs genutzt wurden.<\/p>\n<p>\u2757 <strong>Merke:<\/strong> Pfusche nie mit internen Nachrichten, Pr\u00e4prozessor-Variablen rum, die einen nichts angehen. Oft genug sind schnelle Workarrounds die man mit so etwas erreicht ein Schuss ins eigene Knie. \ud83d\ude42<\/p>\n<p>Ach ja! Man h\u00e4tte \u00fcbrigens noch weiter Pfuschen k\u00f6nnen und <em>_CRT_NOFORCE_MANIFEST<\/em> definieren k\u00f6nnen\u00a0<img src=\"http:\/\/blog.m-ri.de\/wp-includes\/images\/smilies\/mrgreen.png\" alt=\":mrgreen:\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/> ! Dann h\u00e4tten wir den einen Pfusch mit einem anderen behoben!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In dem C++.de Forum kam dieser Thread Sehr spezielles Problem &#8211; (DLL + Manifest)\u00a0auf! Man muss den Thread nicht ganz lesen, ich will hier eine kurze \u00dcbersicht geben, wie man ein Projekt verbiegen kann, dass es nur noch \u00c4rger macht, den man nur schwer (oder nach langem Suchen) in den Griff bekommt. Urspr\u00fcngliches Problem: Es &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2007\/05\/16\/selbstgemachter-manifest-aerger\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eSelbstgemachter Manifest-\u00c4rger&#8230;\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":[19,4,3],"tags":[360,69,36,44],"class_list":["post-71","post","type-post","status-publish","format-standard","hentry","category-crt","category-mfc","category-programmieren","tag-crt","tag-manifest","tag-vs-2005","tag-vs-2008"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/71","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=71"}],"version-history":[{"count":0,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/71\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=71"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=71"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=71"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}