{"id":677,"date":"2010-11-30T22:39:47","date_gmt":"2010-11-30T21:39:47","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=677"},"modified":"2010-11-20T17:28:18","modified_gmt":"2010-11-20T16:28:18","slug":"manifeste-sind-nicht-alles-dlls-und-com-objekte-benoetigen-isolation_aware_enabled-oder-ein-eigenes-activation-context-handling","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2010\/11\/30\/manifeste-sind-nicht-alles-dlls-und-com-objekte-benoetigen-isolation_aware_enabled-oder-ein-eigenes-activation-context-handling\/","title":{"rendered":"Manifeste sind nicht alles, DLLs und COM Objekte ben\u00f6tigen ISOLATION_AWARE_ENABLED oder ein eigenes Activation Context Handling"},"content":{"rendered":"<p>Ich habe eine DLL die einiges an Datenbank I\/O f\u00fcr ein Produkt \u00fcbernimmt. Diese DLL sollte in einem Service eingesetzt werden.<br \/>\nEigentlich ist diese DLL immer nur Teil eines vollen UI Projektes und hat auch einige kleine visuelle Komponenten. Entsprechend pr\u00fcft eine Init Funktion bestimmte Voraussetzungen, die f\u00fcr das korrekte Arbeiten notwendig sind wie: mindestens MS-XML 3.0, IE ab Version 5.1, Common Control 6.0 (also mit Manifest).<br \/>\nSoweit so gut. Die DLL selbst wurde mit einem Manifest (Typ 2) versehen und in den Service mit eingebaut.<\/p>\n<p>Eigent\u00fcmlicherweise startete der Service nicht. Die <em>Init<\/em> Funktion meldete immer, dass die Requirements nicht gegeben w\u00e4ren. Was eigentlich nicht sein kann, weil der selbe Code in einem anderen Kontext eines GUI Programms perfekt funktioniert.<\/p>\n<p>Ein wenig debuggen zeigte, dass die Common Control 6.0 nicht gefunden wurden.<br \/>\nEigentlich kein Wunder. Der Service hat keine UI, es gibt keinen Code der die Common Control 6.0 verwendet, allerdings hatte meine DLL ja ein entsprechendes Manifest f\u00fcr die Common Control 6.0 DLL.<br \/>\nAber der Versionstest in der DLL l\u00e4dt immer die 5er Version, also die Version ohne Manifest.<\/p>\n<p>Es dauerte eine Weile bis es bei mir klingelte und ich verstand worin das Problem lag:<\/p>\n<ul>\n<li>Wenn man ein Manifest in einer DLL mit dem Code 2 eintr\u00e4gt (<em>ISOLATIONAWARE_MANIFEST_RESOURCE_ID<\/em>), dann funktioniert dieses Manifest wenn in diesem Moment die <em>ComCtl32.dll <\/em>implizit geladen werden sollte.<\/li>\n<li>In meinem Fall aber klappte das nicht. Die DLL wurde nicht implizit geladen. Die Versionkontrolle sp\u00e4ter f\u00fchrte <em>LoadLibrary <\/em>direkt durch und f\u00fchrte dann <em>DllGetVersion <\/em>aus (mit GetProcAddress\u00a0ermittelt).<\/li>\n<li>In meinem Fall bedeutet das aber, das LoadLibrary im Aktivierungskontext (Activation Context) der <em>EXE <\/em>ausgef\u00fchrt wird, und die hat kein ComCtl32 Manifest f\u00fcr die Version 6.0. Es ist ja auch nur ein Service.<\/li>\n<li>Damit es funktioniert muss man in jedem Fall auch den folgenden Define setzen.<\/li>\n<\/ul>\n<pre lang=\"cpp\">#define\u00a0ISOLATION_AWARE_ENABLED\u00a01<\/pre>\n<ul>\n<li>oder man muss daf\u00fcr sorgen, dass man seinen eigenen Aktivierungskontext nutzt. Sprich seine Manifeste, die man selber m\u00f6chte.<\/li>\n<li>Durch diesen define, werden bestimmte Funktionen wie <em>CreateWindow<\/em>, <em>LoadLibrary, CoCreateInstance, SendMessage\u00a0<\/em>und andere durch einen inline-Code ersetzt der einen Aktivierungkontext benutzt und die aktuellen Manifeste der DLL bestimmt und benutzt.<\/li>\n<\/ul>\n<p>In meinem Fall hie\u00df die L\u00f6sung nicht <em>LoadLibrary <\/em>zu benutzen sondern <em>GetModuleHandle <\/em>und wenn eben <em>ComCtl32 <\/em>gar nicht im Speicher ist, also auch nicht benutzt wird auch keinen weiteren Test durchzuf\u00fchren, aber zur Sicherheit habe ich auch <em>ISOLATION_AWARE_ENABLED <\/em>gesetzt.<\/p>\n<p>Siehe auch:<br \/>\n<a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/aa376607(VS.85).aspx\">http:\/\/msdn.microsoft.com\/en-us\/library\/aa376607(VS.85).aspx<\/a><br \/>\n<a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/aa375197(VS.85).aspx\">http:\/\/msdn.microsoft.com\/en-us\/library\/aa375197(VS.85).aspx<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich habe eine DLL die einiges an Datenbank I\/O f\u00fcr ein Produkt \u00fcbernimmt. Diese DLL sollte in einem Service eingesetzt werden. Eigentlich ist diese DLL immer nur Teil eines vollen UI Projektes und hat auch einige kleine visuelle Komponenten. Entsprechend pr\u00fcft eine Init Funktion bestimmte Voraussetzungen, die f\u00fcr das korrekte Arbeiten notwendig sind wie: mindestens &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2010\/11\/30\/manifeste-sind-nicht-alles-dlls-und-com-objekte-benoetigen-isolation_aware_enabled-oder-ein-eigenes-activation-context-handling\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eManifeste sind nicht alles, DLLs und COM Objekte ben\u00f6tigen ISOLATION_AWARE_ENABLED oder ein eigenes Activation Context Handling\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":[1],"tags":[],"class_list":["post-677","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/677","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=677"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/677\/revisions"}],"predecessor-version":[{"id":701,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/677\/revisions\/701"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=677"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=677"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=677"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}