<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Martin&#039;s Blog &#187; Manifest</title>
	<atom:link href="http://blog.m-ri.de/index.php/tag/manifest/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.m-ri.de</link>
	<description>Gesammeltes aus dem Leben eines &#34;normalen&#34; Programmierers... :-)</description>
	<lastBuildDate>Sat, 04 Feb 2012 12:07:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Auf was man unbedingt achten muss, wenn man an Manifesten für Assemblies herumbastelt</title>
		<link>http://blog.m-ri.de/index.php/2011/04/25/auf-was-man-unbedingt-achten-muss-wenn-man-an-manifesten-fur-assemblies-herumbastelt/</link>
		<comments>http://blog.m-ri.de/index.php/2011/04/25/auf-was-man-unbedingt-achten-muss-wenn-man-an-manifesten-fur-assemblies-herumbastelt/#comments</comments>
		<pubDate>Mon, 25 Apr 2011 18:34:08 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Vista / Windows 7]]></category>
		<category><![CDATA[Windows API]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Manifest]]></category>
		<category><![CDATA[SxS]]></category>
		<category><![CDATA[WinSxS]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=810</guid>
		<description><![CDATA[Ich habe für ein Projekt Manifeste zur Verwendung von Registration-Free COM Module gebaut. Diese COM-Module wurden über ein Manifest in einer EXE geladen. Natürlich hatte jedes der COM Module wieder ein eigenes Manifest, die ich entsprechend angepasst habe. Jede COM-Class, die verwendet wird, muss ja in dem Manifest der DLL-Assembly aufgeführt werden. Eigentümlich war, dass [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe für ein Projekt Manifeste zur Verwendung von <a href="http://msdn.microsoft.com/en-us/magazine/cc188708.aspx">Registration-Free COM Module</a> gebaut.</p>
<p>Diese COM-Module wurden über ein Manifest in einer EXE geladen. Natürlich hatte jedes der COM Module wieder ein eigenes Manifest, die ich entsprechend angepasst habe. Jede COM-Class, die verwendet wird, muss ja in dem Manifest der DLL-Assembly aufgeführt werden.</p>
<p>Eigentümlich war, dass ich nach Änderungen der Manifeste und auch nachdem das COM Modul komplett neu gelinkt wurde, dennoch die EXE ihr Ladeverhalten nicht geändert hat. Manche COM-Klassen wurden nicht gefunden. Sobald ich aber den Rechner neu gestartet hatte funktionierte ab dann alles wie gewünscht und das geänderte Manifest schien nun wirksam zu sein.</p>
<p>Da gibt es einen Cache dachte ich mir. Und nach einiger Recherche im Internet stieß ich auf den folgenden interessanten Artikel von Junfeng Zang:<br />
<a href="http://blogs.msdn.com/b/junfeng/archive/2007/10/01/vista-activation-context-cache.aspx">Windows Vista Sxs Activation Context Cache</a></p>
<p>Wie man lesen kann, wird bei jedem erfolgreichen Einlesen einer Anwendung und dem erfolgreichen Laden aller Manifeste und DLLs, die ganzen ermittelten Daten in einen Cache gespeichert. Da ich die EXE aber nicht geändert habe, wurden auch die untergeordneten Manifeste nicht neu gelesen, auch wenn diese geändert wurden.</p>
<p>Durch das Ändern des Datums der EXE werden die Cacheeinträge ungültig, und danach werden alle Aktivierungskontexte der Anwednung und aller anderen Assemblies neu geladen.</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/04/25/auf-was-man-unbedingt-achten-muss-wenn-man-an-manifesten-fur-assemblies-herumbastelt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BUG: VS-2010 erkennt nicht die Änderung an einer Manifest Datei in einem C++ Projekt</title>
		<link>http://blog.m-ri.de/index.php/2011/04/09/bug-vs-2010-erkennt-nicht-die-anderung-an-einer-manifest-datei-in-einem-c-projekt/</link>
		<comments>http://blog.m-ri.de/index.php/2011/04/09/bug-vs-2010-erkennt-nicht-die-anderung-an-einer-manifest-datei-in-einem-c-projekt/#comments</comments>
		<pubDate>Sat, 09 Apr 2011 18:53:12 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[Manifest]]></category>
		<category><![CDATA[VS-2010]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=814</guid>
		<description><![CDATA[Ich habe einige Manifest Dateien in meinen Projekten. Viele steuern COM Module und machen diese registration-free. Das ist einfach und effektiv. Dazu habe ich einfach eine entsprechende Manifestdatei angelegt mit den entsprechenden Einträgen und diese in das Projekt eingefügt. Soweit alles gut. Jetzt stellte sich aber heraus, dass VS-2010 (auch SP1), eine Änderung der Manifest [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe einige Manifest Dateien in meinen Projekten. Viele steuern <em>COM</em> Module und machen diese <a href="http://msdn.microsoft.com/en-us/magazine/cc188708.aspx">registration-free</a>. Das ist einfach und effektiv. Dazu habe ich einfach eine entsprechende Manifestdatei angelegt mit den entsprechenden Einträgen und diese in das Projekt eingefügt. Soweit alles gut.</p>
<p>Jetzt stellte sich aber heraus, dass <em>VS-2010</em> (auch SP1), eine Änderung der Manifest Datei nicht bemerkt und die <em>EXE/DLL</em> weder neu linkt, noch das Manifest-Tool anwirft, um das geänderte Manifest in das Executable einzutragen.</p>
<p>Dabei spielt es keinerlei Rolle, ob die Datei nur einfach in das Projekt eingefügt wurde, oder ob die Datei zusätzlich in den Projekteinstellungen für das <em>Manifest Tool</em> bei <em>Additional Manifest Files</em> eingetragen wird.</p>
<p>Das ist ein lästiger Fehler, der in <em>VS-2005</em> und <em>VS-2008</em> nicht vorhanden war.<br />
Er hat mich mindestens 4 Stunden Arbeit gekostet, weil ich bestimmte Abhängigkeiten testen und Fehler beheben wollte aber die neuen Dateien in dem Projekt immer wieder <em>SxS</em> Fehler lieferten. Es dauerte eine ganze Weile bis ich merkte, dass meine Änderungen an den Manifest Dateien überhaupt nicht in meine Executables übernommen wurden und ich immer wieder nur alte Manifeste in den <em>EXEs</em> und <em>DLLs</em> hatte.<br />
Und dann das Ganze an einem Montagmorgen und nach der Zeitumstellung&#8230; <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Auf Connect habe ich einen entsprechenden Bug veröffentlich und mir wurde ein Fix empfohlen, der bei mir das Problem behebt.<br />
<a href="http://connect.microsoft.com/VisualStudio/feedback/details/654293/changes-to-a-manifest-file-in-a-c-project-does-not-trigger-a-rebuild-of-the-exe-or-dll">Changes to a Manifest file in a C++ project does not trigger a rebuild of the EXE or DLL</a></p>
<p>In der Datei <strong>%Programfiles%\msbuild\microsoft.cpp\v4.0\Microsoft.cppcommon.targets</strong> wird die folgenden Kommentarzeile gesucht:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!-- If RC did produce an output, then force link to embed that manifest.</span>
<span style="color: #808080; font-style: italic;">     This enforcement is required for projects residing on FAT32 drives. --&gt;</span></pre></div></div>

<p>Darunter wird der folgende Textblock eingefügt:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;PropertyGroup<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;LinkSkippedExecution</span> <span style="color: #000066;">Condition</span>=<span style="color: #ff0000;">&quot;@(RCSourcesCompiled)!=''&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        false
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/LinkSkippedExecution<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/PropertyGroup<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Danch wird eine Änderung im Manifest korrekt erkannt und der Linker für die geänderte Ressouce angeworfen.</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/04/09/bug-vs-2010-erkennt-nicht-die-anderung-an-einer-manifest-datei-in-einem-c-projekt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ComboBox DropDown Höhe wird nicht mehr durch die Ressourcen definiert</title>
		<link>http://blog.m-ri.de/index.php/2010/11/26/combobox-dropdown-hoehe-wird-nicht-mehr-durch-die-ressourcen-definiert/</link>
		<comments>http://blog.m-ri.de/index.php/2010/11/26/combobox-dropdown-hoehe-wird-nicht-mehr-durch-die-ressourcen-definiert/#comments</comments>
		<pubDate>Fri, 26 Nov 2010 21:22:17 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Windows API]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[ComCtl32]]></category>
		<category><![CDATA[Manifest]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[Win32]]></category>
		<category><![CDATA[WinAPI]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=689</guid>
		<description><![CDATA[Vor Jahren habe ich für die microsoft.public.de.vc FAQ den folgenden Beitrag geschrieben: Warum klappt meine ComboBox im DropDown-Stil in einem Dialog nicht auf? Beim Erstellen einer ComboBox in einem Dialog Template muss auch die Größe mit angegeben werden, die die ComboBox haben soll, wenn Sie denn aufgeklappt wird. Dies kann auf zwei Methoden geschehen. Methode [...]]]></description>
			<content:encoded><![CDATA[<p>Vor Jahren habe ich für die microsoft.public.de.vc FAQ den folgenden Beitrag geschrieben:<br />
<a href="#Q16">Warum klappt meine ComboBox im DropDown-Stil in einem Dialog nicht auf?</a></p>
<p style="padding-left: 30px;">Beim Erstellen einer ComboBox in einem Dialog Template muss auch die Größe mit angegeben werden, die die ComboBox haben soll, wenn Sie denn aufgeklappt wird. Dies kann auf zwei Methoden geschehen.</p>
<p style="padding-left: 30px;">Methode 1: ComboBox aus der Werkzeugleiste einfach durch einen Mausklick einsetzen. Anschließend auf den &#8220;DropDown&#8221;-Schalter klicken und nun die gewünschte Größe einstellen.</p>
<p style="padding-left: 30px;">Methode 2: ComboBox durch Ziehen eines Rechteckes auf dem Dialog einsetzen. In diesem Fall wird die Größe gleich korrekt bestimmt. Nachträgliche Änderung der Größe erfolgt dann wieder durch anklicken des &#8220;DropDown&#8221;-Schalters.</p>
<p style="padding-left: 30px;">Anmerkung: Die Größe einer ComboBox mit dem Stil CBS_DROPDOWN und CBS_DROPDOWNLIST im NICHT aufgeklappten Zustand kann beim Erzeugen nicht verändert werden. Diese Größe bestimmt Windows automatisch. Die Größe die bei CreateWindow/CreateWindowEx angegeben wird ist immer die Größe des Control im aufgeklappten Zustand. Nachdem ein gültiger Windowshandle auf die ComboBox existiert kann mit CComboBox::SetItemHeight die Höhe der Items bzw. des Editfelds der ComboBox verändert werden.</p>
<p>Jetzt habe ich entdeckt, dass dieser Beitrag eigentlich überflüssig geworden ist, seit dem es <em>COMCTL32</em> in der Version 6.0 gibt.<br />
Wenn ein Manifest für die 6.0 Version der Common Controls vorhanden ist, dann bestimmt die <em>COMCTL32</em> DLL automatisch selbst anhand der Höhe des Monitors und der Position der ComboBox wie groß der DropDown-Bereich sein kann.</p>
<p>Aufgefallen ist mir das, als ich in einer RC-Datei sah, dass eine ComboBox mit der Höhe gerade einmal 20 DLUs angegeben wurde. Da in der RC Datei normalerweise immer nur die DropDown-Höhe eingetragen ist, fragte ich mich warum bisher niemandem aufgefallen war, dass diese ComboBox, nicht aufklappt. Ein kurzer Test, zeigte allerdings, dass alles normal war und die Box, den halben Monitor in der Höhe einnahm.<br />
Ein weiter Test mit und ohne Manifest zeigte mir dann schnell, dass sich das Standardverhalten von Comboboxen offensichtlich verändert hat.</p>
<p><strong>Nachtrag (07.01.2011):<br />
</strong>Nur die neuen Common Controls ab Vista und <em>Windows 7</em> verhalten sich wie oben beschrieben. <em>Windows XP </em>(einschließlich <em>SP3</em>) verhält sich noch gemäß der MSDN WinAPI Doku. D.h. die Höhe wird nicht automatisch angepasst. Man kann sich eben auf nichts verlassen.</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2010/11/26/combobox-dropdown-hoehe-wird-nicht-mehr-durch-die-ressourcen-definiert/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hotfix für UseMSPrivateAssemblies.h und VC-2008</title>
		<link>http://blog.m-ri.de/index.php/2008/05/06/hotfix-fuer-usemsprivateassembliesh-und-vc-2008/</link>
		<comments>http://blog.m-ri.de/index.php/2008/05/06/hotfix-fuer-usemsprivateassembliesh-und-vc-2008/#comments</comments>
		<pubDate>Tue, 06 May 2008 19:00:38 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[ATL]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[CRT]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Vista / Windows 7]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[Windows API]]></category>
		<category><![CDATA[Manifest]]></category>
		<category><![CDATA[MFCNext]]></category>
		<category><![CDATA[Vista]]></category>
		<category><![CDATA[VS-2005]]></category>
		<category><![CDATA[VS-2008]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/index.php/2008/05/06/hotfix-fuer-usemsprivateassembliesh-und-vc-2008/</guid>
		<description><![CDATA[Einige nutzen ja meine Lösung für private CRT und MFC Assemblies unter VC-2005, die ich in dem diesem Artikel unter Codeproject veröffentlicht habe http://www.codeproject.com/KB/cpp/PrivateAssemblyProjects.aspx Das Interesse und die Nachfrage ist groß dieses Verfahren auch unter VC-2008 zu nutzen. Da ich aber aktuell wenig Zeit habe den Artikel komplett zu überarbeiten, veröffentliche ich den relevanten Code [...]]]></description>
			<content:encoded><![CDATA[<p>Einige nutzen ja meine Lösung für private CRT und MFC Assemblies unter VC-2005, die ich in dem diesem Artikel unter Codeproject veröffentlicht habe<br />
<a href="http://www.codeproject.com/KB/cpp/PrivateAssemblyProjects.aspx">http://www.codeproject.com/KB/cpp/PrivateAssemblyProjects.aspx</a></p>
<p>Das Interesse und die Nachfrage ist groß dieses Verfahren auch unter VC-2008 zu nutzen.<br />
Da ich aber aktuell wenig Zeit habe den Artikel komplett zu überarbeiten, veröffentliche ich den relevanten Code hier erst mal vorab als &#8220;Hotfix&#8221;. Dieser Hotfix setzt voraus, dass das aktuelle <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=d466226b-8dab-445f-a7b4-448b326c48e7&amp;displaylang=en">Feature Pack</a> installiert ist. Der Code ist nicht auf die RTM Version hin zugeschnitten und getestet.</p>
<p><strong>UseMSPrivateAssemblies.h</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// Version 2.0 by Martin Richter [WWJD]</span>
<span style="color: #666666;">// Supports VC-2005 and VC-2008</span>
<span style="color: #339900;">#pragma once    </span>
&nbsp;
<span style="color: #339900;">#ifndef RC_INVOKED</span>
<span style="color: #666666;">// Avoid problems with the resource compiler if included    </span>
&nbsp;
<span style="color: #666666;">// This defines bock the creation in the header files</span>
<span style="color: #339900;">#pragma message(&quot;Using private assemblies for the MS runtimes&quot;)</span>
<span style="color: #339900;">#define _STL_NOFORCE_MANIFEST</span>
<span style="color: #339900;">#define _CRT_NOFORCE_MANIFEST</span>
<span style="color: #339900;">#define _AFX_NOFORCE_MANIFEST</span>
<span style="color: #666666;">//#define _ATL_NOFORCE_MANIFEST    </span>
&nbsp;
<span style="color: #666666;">// The next statements block the linker from including object files in the</span>
<span style="color: #666666;">// CRT and the MFC, that would create manifest pragmas too.</span>
<span style="color: #339900;">#ifdef __cplusplus</span>
<span style="color: #0000ff;">extern</span> <span style="color: #FF0000;">&quot;C&quot;</span> <span style="color: #008000;">&#123;</span>            <span style="color: #ff0000; font-style: italic;">/* Assume C declarations for C++ */</span>
<span style="color: #339900;">#endif    </span>
&nbsp;
__declspec<span style="color: #008000;">&#40;</span>selectany<span style="color: #008000;">&#41;</span>       <span style="color: #0000ff;">int</span> _forceCRTManifest<span style="color: #008080;">;</span>
__declspec<span style="color: #008000;">&#40;</span>selectany<span style="color: #008000;">&#41;</span>       <span style="color: #0000ff;">int</span> _forceMFCManifest<span style="color: #008080;">;</span>
<span style="color: #666666;">// __declspec(selectany)    int _forceAtlDllManifest;    </span>
&nbsp;
<span style="color: #666666;">// The next symbols are used by the several versions of VC 9.0</span>
__declspec<span style="color: #008000;">&#40;</span>selectany<span style="color: #008000;">&#41;</span>       <span style="color: #0000ff;">int</span> _forceCRTManifestRTM<span style="color: #008080;">;</span>
__declspec<span style="color: #008000;">&#40;</span>selectany<span style="color: #008000;">&#41;</span>       <span style="color: #0000ff;">int</span> _forceMFCManifestRTM<span style="color: #008080;">;</span>
__declspec<span style="color: #008000;">&#40;</span>selectany<span style="color: #008000;">&#41;</span>       <span style="color: #0000ff;">int</span> _forceMFCManifestCUR<span style="color: #008080;">;</span>    
&nbsp;
<span style="color: #339900;">#ifdef __cplusplus</span>
<span style="color: #008000;">&#125;</span>                        <span style="color: #ff0000; font-style: italic;">/* __cplusplus */</span>
<span style="color: #339900;">#endif    </span>
&nbsp;
<span style="color: #666666;">// We use crtassem.h with the defines there. It just gives us the</span>
<span style="color: #666666;">// versions and name parts for the dependencies.</span>
<span style="color: #666666;">// Note that there is also a MFCassem.h but this include file has the</span>
<span style="color: #666666;">// manifest pragma's already in it. So we can't use it</span>
<span style="color: #666666;">//</span>
<span style="color: #666666;">// Three files are controlling this crtassem.h, MFCassem.h and atlassem.h!</span>
<span style="color: #666666;">// Happily __LIBRARIES_ASSEMBLY_NAME_PREFIX is used in CRT, MFC and ATL!</span>
<span style="color: #666666;">// Doing it right would need to use _MFC_ASSEMBLY_VERSION for the MFC</span>
<span style="color: #666666;">// but in fact _CRT_ASSEMBLY_VERSION and _MFC_ASSEMBLY_VERSION and</span>
<span style="color: #666666;">// _ATL_ASSEMBLY_VERSION are the same</span>
<span style="color: #666666;">//  - VC-2005 SP1 8.0.50727.762</span>
<span style="color: #666666;">//  - VC-2008 RTM 9.0.21022.8</span>
<span style="color: #666666;">//  - VC-2008 Feature Pack 9.0.30411.0 (used if _BIND_TO_CURRENT_VCLIBS_VERSION</span>
<span style="color: #666666;">//    and _BIND_TO_CURRENT_MFC_VERSION are defined to 1)    </span>
&nbsp;
<span style="color: #339900;">#include &lt;crtassem.h&gt;</span>
&nbsp;
<span style="color: #666666;">// We don't have a seperate block for the Debug version. We just handle</span>
<span style="color: #666666;">// this with a extra define here.</span>
<span style="color: #339900;">#ifdef _DEBUG</span>
<span style="color: #339900;">#define __LIBRARIES_SUB_VERSION    &quot;Debug&quot;</span>
<span style="color: #339900;">#else</span>
<span style="color: #339900;">#define __LIBRARIES_SUB_VERSION    &quot;&quot;</span>
<span style="color: #339900;">#endif    </span>
&nbsp;
<span style="color: #666666;">// Manifest for the CRT</span>
<span style="color: #339900;">#pragma comment(linker,&quot;/manifestdependency:\&quot;type='win32' &quot;                        \
    &quot;name='&quot; __LIBRARIES_ASSEMBLY_NAME_PREFIX &quot;.&quot; __LIBRARIES_SUB_VERSION &quot;CRT' &quot;   \
    &quot;version='&quot; _CRT_ASSEMBLY_VERSION &quot;' &quot;                                          \
    &quot;processorArchitecture='x86' \&quot;&quot;)    </span>
&nbsp;
<span style="color: #666666;">// Manifest for the MFC</span>
<span style="color: #339900;">#pragma comment(linker,&quot;/manifestdependency:\&quot;type='win32' &quot;                        \
    &quot;name='&quot; __LIBRARIES_ASSEMBLY_NAME_PREFIX &quot;.&quot; __LIBRARIES_SUB_VERSION &quot;MFC' &quot;   \
    &quot;version='&quot; _CRT_ASSEMBLY_VERSION &quot;' &quot;                                          \
    &quot;processorArchitecture='x86'\&quot;&quot;)    </span>
&nbsp;
<span style="color: #666666;">// #pragma comment(linker,&quot;/manifestdependency:\&quot;type='win32' &quot;                     \
//     &quot;name='&quot; __LIBRARIES_ASSEMBLY_NAME_PREFIX &quot;.MFCLOC' &quot;                        \
//     &quot;version='&quot; _CRT_ASSEMBLY_VERSION &quot;' &quot;                                       \
//     &quot;processorArchitecture='x86'\&quot;&quot;)    </span>
&nbsp;
<span style="color: #666666;">// Manifest for the ATL</span>
<span style="color: #666666;">// #pragma comment(linker,&quot;/manifestdependency:\&quot;type='win32' &quot;                     \
//    &quot;name='&quot; __LIBRARIES_ASSEMBLY_NAME_PREFIX &quot;.ATL' &quot;                            \
//    &quot;version='&quot; _CRT_ASSEMBLY_VERSION &quot;' &quot;                                        \
//    &quot;processorArchitecture='x86' \&quot;&quot;)    </span>
&nbsp;
<span style="color: #339900;">#endif // RC_INVOKED</span></pre></td></tr></table></div>

<p><strong>Anmerkungen:</strong></p>
<ul>
<li>Im Endeffekt sind nur 3 Zeilen (26-28) hinzugekommen.</li>
<li>Diese Version funktioniert sowohl für VC-2005 als auch VC-2008!</li>
<li>Unter Vista wird allgemein das Problem beobachtet, das private Assemblies nur genutzt werden können, wenn diese in einem Unterverzeichnis liegen. Liegen die Assembly Dateien im gleichen Verzeichnis wie die EXE kommt es zu einem Fehler <em>&#8220;The application failed to initialize properly (0xc0000034). &#8220;</em> Dieser Sache bin ich (und andere) auf der Spur.</li>
<li>Es spielt für diesen Code keine Rolle ob die beiden Defines <em>_BIND_TO_CURRENT_VCLIBS_VERSION </em>und <em>_BIND_TO_CURRENT_MFC_VERSION </em>gesetzt wurden. Werden diese Defines auf 1 gesetzt bevor UseMSPrivateAssemblies inkludiert wird, dann werden die Manifeste so erzeugt, dass die Feature Pack DLLs gezogen werden. Sind diese beiden Defines nicht gesetzt werden Manifeste für die RTM Version erzeugt.<br />
Ich empfehle dringend diese beiden Defines zu setzen <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' /> </li>
</ul>
<p>Das ist erstmal ein Schnellschuss für alle, die die es etwas eiliger haben.</p>
<p>Der Vorteil gegenüber der Lösung, bei der die Manifeste manuell bearbeitet werden, wie es zum Beispiel <a href="http://blog.kalmbach-software.de/2008/05/03/howto-deploy-vc2008-apps-without-installing-vcredist_x86exe/">Jochen Kalmbach in seinem Blog</a> vorgestellt hat ist klar:<br />
Man muss eben nichts manuell machen <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Es macht wieder alles der Compiler und Linker.</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2008/05/06/hotfix-fuer-usemsprivateassembliesh-und-vc-2008/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Die Manifest Pest&#8230;</title>
		<link>http://blog.m-ri.de/index.php/2007/06/22/die-manifest-pest/</link>
		<comments>http://blog.m-ri.de/index.php/2007/06/22/die-manifest-pest/#comments</comments>
		<pubDate>Fri, 22 Jun 2007 15:42:59 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Vista / Windows 7]]></category>
		<category><![CDATA[Windows API]]></category>
		<category><![CDATA[Manifest]]></category>
		<category><![CDATA[Vista]]></category>
		<category><![CDATA[WinAPI]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/index.php/2007/06/22/die-manifest-pest/</guid>
		<description><![CDATA[Hier noch mal ein paar wirklich nette Sachen, die zeigen warum ich Manifeste mittlerweile  nicht mehr ganz so mag (um es wirklich vorsichtig auszudrücken): Was passiert eigentlich wenn man ein internes UND ein externes Manifest zu einer DLL oder EXE hinzufügt? Auf einem XP Rechner wird der Lader das externe Manifest bevorzugen, das interne Manifest wird [...]]]></description>
			<content:encoded><![CDATA[<p>Hier noch mal ein paar wirklich nette Sachen, die zeigen warum ich Manifeste mittlerweile  nicht mehr ganz so mag (um es wirklich vorsichtig auszudrücken):</p>
<p>Was passiert eigentlich wenn man ein internes <em><strong>UND </strong></em>ein externes Manifest zu einer DLL oder EXE hinzufügt?</p>
<ol>
<li>Auf einem <em>XP</em> Rechner wird der Lader das externe Manifest bevorzugen, das interne Manifest wird ignoriert.</li>
<li>Auf einem <em>Windows 2003</em> oder <em>Vista</em> Rechner wird das interne Manifest bevorzugt und das externe Manifest wird ignoriert.</li>
<li>Handelt es sich um eine DLL die mit <em>LoadLibrary </em>geladen wird, dann wird niemals ein externes Manifest berücksichtigt, selbst wenn kein internes Manifest vorliegt. Hier verhalten sich <em>XP</em>, <em>2003 </em>und <em>Vista </em>gleich.</li>
</ol>
<p>Ein Grund mehr zu meiner Empfehlung: Verwende immer nur interne Manifeste!</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2007/06/22/die-manifest-pest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mein erster Codeproject Artikel&#8230;</title>
		<link>http://blog.m-ri.de/index.php/2007/06/12/mein-erster-codeproject-artikel/</link>
		<comments>http://blog.m-ri.de/index.php/2007/06/12/mein-erster-codeproject-artikel/#comments</comments>
		<pubDate>Tue, 12 Jun 2007 21:19:06 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[CRT]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Codeproject]]></category>
		<category><![CDATA[Manifest]]></category>
		<category><![CDATA[Vista]]></category>
		<category><![CDATA[VS-2005]]></category>
		<category><![CDATA[VS-2008]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/index.php/2007/06/12/mein-erster-codeproject-artikel/</guid>
		<description><![CDATA[Nun habe ich es endlich mal geschafft und meinen ersten kleinen Artikel auf Codeproject geschrieben: http://www.codeproject.com/cpp/PrivateAssemblyProjects.asp  Er schließt sich nahtlos an über alles das was ich hier achon über die Manifest-Hölle geschrieben haben&#8230; Copyright &#169; 2010 Martin RichterDieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier [...]]]></description>
			<content:encoded><![CDATA[<p>Nun habe ich es endlich mal geschafft und meinen ersten kleinen Artikel auf Codeproject geschrieben:</p>
<p><a href="http://www.codeproject.com/cpp/PrivateAssemblyProjects.asp">http://www.codeproject.com/cpp/PrivateAssemblyProjects.asp</a></p>
<p> Er schließt sich nahtlos an über alles das was ich hier achon über die Manifest-Hölle geschrieben haben&#8230;</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2007/06/12/mein-erster-codeproject-artikel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>_MFC_NOFORCE_MANIFEST und _ATL_NOFORCE_MANIFEST</title>
		<link>http://blog.m-ri.de/index.php/2007/06/04/_mfc_noforce_manifest-und-_atl_noforce_manifest/</link>
		<comments>http://blog.m-ri.de/index.php/2007/06/04/_mfc_noforce_manifest-und-_atl_noforce_manifest/#comments</comments>
		<pubDate>Mon, 04 Jun 2007 20:32:04 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[ATL]]></category>
		<category><![CDATA[CRT]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Manifest]]></category>
		<category><![CDATA[Vista]]></category>
		<category><![CDATA[VS-2005]]></category>
		<category><![CDATA[VS-2008]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/index.php/2007/06/04/_mfc_noforce_manifest-und-_atl_noforce_manifest/</guid>
		<description><![CDATA[In meinem Blog habe ich bereits über Libraries und die Verwendug von _CRT_NOFORCE_MANIFEST geschrieben (siehe Link unten). Wenn man nun eine Library erzeugt, die die MFC oder die ATL benutzt, sollte man sich auch noch der beiden Defines _MFC_NOFORCE_MANIFEST und _ATL_NOFORCE_MANIFEST bewusst sein. Diese beiden Defines verhindern, dass durch die Verwendung der ATL bzw. MFC [...]]]></description>
			<content:encoded><![CDATA[<p>In meinem Blog habe ich bereits über Libraries und die Verwendug von <em>_CRT_NOFORCE_MANIFEST</em> geschrieben (siehe Link unten).</p>
<p>Wenn man nun eine Library erzeugt, die die MFC oder die ATL benutzt, sollte man sich auch noch der beiden Defines <em>_MFC_NOFORCE_MANIFEST </em>und <em>_ATL_NOFORCE_MANIFEST </em>bewusst sein. Diese beiden Defines verhindern, dass durch die Verwendung der ATL bzw. MFC Include-Dateien <em>#pragma comment(linker,”/manifestdependency:..”)</em> Statements erzeugt werden.</p>
<p>Werden diese Defines konsequent verwendet, dann hat der Benutzer der Library die volle Kontrolle welche CRT, MFC bzw. ATL Version angebunden wird.</p>
<p>Warum man sich mit diesen Defines beim erzeugen einer Library auseinenadersetzen sollte kann man in diesem Artikel nachlesen: <a href="http://blog.m-ri.de/index.php/2007/03/22/warum-man-seine-libraries-mit-_crt_noforce_manifest-erzeugen-sollte/">Warum man seine Libraries mit _CRT_NOFORCE_MANIFEST erzeugen sollte!</a></p>
<p> <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' />  BTW: Durch diese Defines kann man allerdings nicht verhindern, dass überhaupt Manifest-Einträge erzeugt werden. Selbst wenn man sein Programm mit den entsprechenden Defines kompiliert. Die Objektdateien haben dann zwar keine Manifest-Einträge, aber spätestens in dem Moment, in dem man das Programm linkt werden aus der CRT, MFC bzw. ATL Libraries Objektdateien gezogen die wieder entsprechende <em>#pragma comment(linker,”/manifestdependency:..”)</em> Einträge haben. Entsprechend bekommt das Manifest Tool dann auch Futter. Dazu mehr in einem späteren Artikel <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2007/06/04/_mfc_noforce_manifest-und-_atl_noforce_manifest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Selbstgemachter Manifest-Ärger&#8230;</title>
		<link>http://blog.m-ri.de/index.php/2007/05/16/selbstgemachter-manifest-aerger/</link>
		<comments>http://blog.m-ri.de/index.php/2007/05/16/selbstgemachter-manifest-aerger/#comments</comments>
		<pubDate>Wed, 16 May 2007 16:25:20 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[CRT]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Manifest]]></category>
		<category><![CDATA[VS-2005]]></category>
		<category><![CDATA[VS-2008]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/index.php/2007/05/16/selbstgemachter-manifest-aerger/</guid>
		<description><![CDATA[In dem C++.de Forum kam dieser Thread Sehr spezielles Problem &#8211; (DLL + Manifest) auf! Man muss den Thread nicht ganz lesen, ich will hier eine kurze Übersicht geben, wie man ein Projekt verbiegen kann, dass es nur noch Ärger macht, den man nur schwer (oder nach langem Suchen) in den Griff bekommt. Ursprüngliches Problem: Es [...]]]></description>
			<content:encoded><![CDATA[<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> auf!</p>
<p>Man muss den Thread nicht ganz lesen, ich will hier eine kurze Übersicht geben, wie man ein Projekt verbiegen kann, dass es nur noch Ärger macht, den man nur schwer (oder nach langem Suchen) in den Griff bekommt.</p>
<p><strong>Ursprüngliches Problem:<br />
</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ängig ist. Es ging um ein spezielles Plugin (also eine DLL).</p>
<p><strong>Die Empfehlung war, wie so oft bei Manifest Problemen:</strong><br />
Linke sowohl CRT als auch MFC statisch.</p>
<p><strong>Begründung:</strong><br />
Die DLL benötigt keine weiteren DLLs oder Third Party Libs. Ist also mehr oder weniger standalone. Also warum noch zusätzliche Abhängigkeiten schaffen. Auch wenn dies etwas mehr Hauptspeicher kostet, wenn andere Applikationen die 8.0 Runtime-Libs auch gleichzeitig verwenden können.<br />
Es erübrigt die Installation der VCRedist_x86.exe oder auch andere, komplexere Tricks wie die applikationslokale Installation der Runtime-Libs.</p>
<p><strong>Folgeproblem:</strong><br />
Sowohl für die MFC als auch für die CRT wurde nun statisches Linken im Projekt eingestellt. Aber dennoch wurde weiterhin ein Manifest erzeugt, das die CRT anforderte.<br />
Das erzeugte doch nun einiges Rätselraten bei mir. <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_confused.gif' alt=':?' class='wp-smiley' /><br />
Auch die Projektdatei, die mir zugesandt wurde brachte auf den ersten Blick keinen Aufschluss über das Problem.<br />
Weitere Prüfung 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>
<p><strong>Lösung:</strong><br />
Einze kurze Recherche in der <em>crtdefs.h</em> ergab, dass die <em>#pragma</em> Einträge für die Manifeste nur erzeugt werden wenn, <em>_DLL</em> definiert wird. Die Doku sagt klar:</p>
<ol>
<li>Das ist eine interne, vordefinierte Präprozessor Variable</li>
<li>Diese ist nur bei den Kompileroptionen <em>/MD</em> und <em>/MDd</em> definiert</li>
</ol>
<p>Derjenige, der dieses Projekt erzeugt hat, hat auch die Präprozessor Variable <em>_DLL</em> vordefiniert. Das Resultat war natürlich, dass Manifest-Einträge erzeugt wurden und weiterhin die CRT-DLLs genutzt wurden.</p>
<p> <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' />  <strong>Merke:</strong> Pfusche nie mit internen Nachrichten, Präprozessor-Variablen rum, die einen nichts angehen. Oft genug sind schnelle Workarrounds die man mit so etwas erreicht ein Schuss ins eigene Knie. <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Ach ja! Man hätte übrigens noch weiter Pfuschen können und <em>_CRT_NOFORCE_MANIFEST</em> definieren können :mrgreen: ! Dann hätten wir den einen Pfusch mit einem anderen behoben!</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2007/05/16/selbstgemachter-manifest-aerger/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wie einen Prozess unter Vista mit gehobenen Rechten starten?</title>
		<link>http://blog.m-ri.de/index.php/2007/05/09/wie-einen-prozess-unter-vista-mit-gehobenen-rechten-starten/</link>
		<comments>http://blog.m-ri.de/index.php/2007/05/09/wie-einen-prozess-unter-vista-mit-gehobenen-rechten-starten/#comments</comments>
		<pubDate>Wed, 09 May 2007 12:59:17 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Vista / Windows 7]]></category>
		<category><![CDATA[Windows API]]></category>
		<category><![CDATA[Manifest]]></category>
		<category><![CDATA[Vista]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/index.php/2007/05/09/wie-einen-prozess-unter-vista-mit-gehobenen-rechten-starten/</guid>
		<description><![CDATA[Was macht man eigentlich wenn man einen Prozess unter Vista hat, der mit normalen Rechten arbeitet, nun aber einen Prozess starten möchte, der angehobene Rechte (elevated) benutzen soll? Also quasi eine Abkürzung für &#8220;rechter Mausklick -&#62; Als Administrator ausführen&#8221;. Das ist ausgesprochen einfach! Man verwendet ShellExecute oder ShellExecuteEx mit dem neuen Verb &#8220;runas&#8221;. Der nachfolgende [...]]]></description>
			<content:encoded><![CDATA[<p>Was macht man eigentlich wenn man einen Prozess unter Vista hat, der mit normalen Rechten arbeitet, nun aber einen Prozess starten möchte, der angehobene Rechte (elevated) benutzen soll? Also quasi eine Abkürzung für <em>&#8220;rechter Mausklick -&gt; Als Administrator ausführen&#8221;</em>.</p>
<p>Das ist ausgesprochen einfach! Man verwendet <em>ShellExecute</em> oder <em>ShellExecuteEx </em>mit dem neuen Verb <strong>&#8220;runas&#8221;</strong>.</p>
<p>Der nachfolgende Code startet die Systemsteuerung mit angehobenen (administrativen/elevated) Rechten. Vorher erfolgt natürlich die allseits bekannte UAC Nachricht. Ist der User kein Administrator bekommt er eine Meldung, dass er sich entsprechend anmelden soll. Ansonsten muss er dem Zugriff zustimmen. Bricht der User den Dialog ab wird nichts ausgeführt.</p>
<p class="ccode">int _tmain(int argc, _TCHAR* argv[])<br />
{<br />
  SHELLEXECUTEINFO shExecInfo;<br />
  <br />
  shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);<br />
  shExecInfo.fMask = NULL;<br />
  shExecInfo.hwnd = NULL;<br />
  shExecInfo.lpVerb = _T(&#8220;runas&#8221;);<br />
  shExecInfo.lpFile = _T(&#8220;control.exe&#8221;);<br />
  shExecInfo.lpParameters = NULL;<br />
  shExecInfo.lpDirectory = NULL;<br />
  shExecInfo.nShow = SW_SHOW;<br />
  shExecInfo.hInstApp = NULL;<br />
  <br />
  ShellExecuteEx(&amp;shExecInfo);<br />
  return 0;<br />
}</p>
<p> <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' />  PS: Übrigens versteht auch <em>Windows 2003 Server </em>und <em>Windows XP </em>das &#8220;runas&#8221; Verb. In diesem Fall wird der entsprechende Anmeldedialog gezeigt, der es erlaubt den aktuellen Benutzer zu verwenden (mit evtl. eingeschränkten Rechten), oder eben einen anderen Account. Nett! <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Nur scheinbar auch ein Feature, dass wieder mal nicht dokumentiert ist.</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2007/05/09/wie-einen-prozess-unter-vista-mit-gehobenen-rechten-starten/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Warum man seine Libraries mit _CRT_NOFORCE_MANIFEST erzeugen sollte</title>
		<link>http://blog.m-ri.de/index.php/2007/03/22/warum-man-seine-libraries-mit-_crt_noforce_manifest-erzeugen-sollte/</link>
		<comments>http://blog.m-ri.de/index.php/2007/03/22/warum-man-seine-libraries-mit-_crt_noforce_manifest-erzeugen-sollte/#comments</comments>
		<pubDate>Thu, 22 Mar 2007 17:46:39 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[CRT]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Manifest]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/index.php/2007/03/22/warum-man-seine-libraries-mit-_crt_noforce_manifest-erzeugen-sollte/</guid>
		<description><![CDATA[Seit VC 2005 wird die DLL-Version CRT ja grundsätzlich über ein Manifest geladen. Erzeuge ich Code, der die CRT verwendet, dann wird automatisch ein #pragma comment(linker,&#8221;/manifestdependency:..&#8221;) Eintrag erzeugt. Den entsprechenden Code dazu findet man in der _crtdefs.h Datei des entsprechenden Include-Pfades. Dieser Manifest Eintrag wird später vom Manifest Tool (MT.EXE) gesammelt und im Manifest der [...]]]></description>
			<content:encoded><![CDATA[<p>Seit VC 2005 wird die DLL-Version CRT ja grundsätzlich über ein Manifest geladen. Erzeuge ich Code, der die CRT verwendet, dann wird automatisch ein <em>#pragma comment(linker,&#8221;/manifestdependency:..&#8221;)</em> Eintrag erzeugt. Den entsprechenden Code dazu findet man in der _crtdefs.h Datei des entsprechenden Include-Pfades.</p>
<p>Dieser Manifest Eintrag wird später vom <em>Manifest Tool (MT.EXE)</em> gesammelt und im Manifest der Applikation oder der DLL verbaut.</p>
<p>Gesetzt den Fall ich habe Library erzeugt, die auch die DLL-Version der CRT verwendet, dann wird automatisch die entsprechende Version der CRT im Manifest hinterlegt. D.h. bei VS 2005 RTM die CRT Version 8.0.50727.42 und bei SP1 die CRT Version 8.0.50727.762</p>
<p>Wird nun für ein Projekt eine Library erzeugt mit einem VS 2005 RTM, und evtl. diese LIB lange nicht verändert und dann diese Library in einem Programm verwendet, dass mit VS 2005 SP1 erzeugt wird, dann werden beide CRT Versionen im Manifest eingetragen!<br />
Der Lader ist zwar intelligent und lädt die letzte DLL (SP1). Aber undurchsichtig wird es in jedem Fall.<br />
Vor allem wenn man wirklich mit evtl. einer älteren Version ausliefern möchte und SP1 auf der Ziel-Maschine nicht installiert ist.</p>
<p>Ich habe noch nicht genau herausbekommen wie entschieden wird welches der Manifesteintrag ist, der letzten Endes zählt. Scheinbar macht es auch nichts wenn, man die Version der CRT Versionen falsch angibt. Es wird dann die CRT mit der nächst höheren CRT geladen&#8230; (aber dazu muss ich noch etwas experimentieren)&#8230;</p>
<p>Dieses Verhalten ist gravierend unterschiedlich zu allen Vorgängerversionen von VC. Wie bisher hält Microsoft das Versprechen der binären Kompatibilität. Theoretisch müsste auch die mit RTM erzeugte LIB sofort funktionieren. Auch der Linker wird diese LIB sofort mit der entsprechenden <em>MSVCR80(D).DLL</em> verbinden. Nur hat er eben nicht das letzte Wort bei den Manifesten.</p>
<p>Man kann das ganze verhindern, indem man <em>_CRT_NOFORCE_MANIFEST</em> bevor die CRT Dateien inkludiert werden (am Besten in der stdafx.h oder in den Projekteinstellungen).<br />
In diesem Fall wird kein #pragma, dass für den Manifest Eintrag verantwortlich ist, erzeugt.<br />
Der Effekt ist dann wie gewollt, dass nur das eigentliche Projekt, dass dann das Executable erzeugt Einfluss auf die Ausgabe des Manifestes hat. Man kann also dann auch eine Lib-Datei mit VS-2005 SP1 erzeugen und mit einem VS-2005 RTM linken. Das Manifest wurde durch diese Lib dann nicht beeinflusst und so soll es IMHO sein.</p>
<p><strong>Aber aufgepasst:</strong><br />
Seit VS-2005 muss in jedem Fall auf <strong>noch </strong>eine strenge Trennung der Release und Debug Versionen achten. Wenn nun kein Manifest mehr zum Beispiel in einer Release-Lib erzeugt wird, weil _CRT_NOFORCE_MANIFEST verwendet wird, nun aber diese Release Lib in ein Debug Projekt eingebunden wird.  Dann wird das Executable implizit mit der MSVCR80.DLL gebunden, aber diese DLL kann nur über ein Manifest geladen werden. Das ist aber nicht vorhanden. Resultat ist das was in diesem Beitrag beschrieben steht: <a href="http://blog.m-ri.de/index.php/2007/03/20/manifest-hoelle-msvcr80dll-nicht-gefunden/" title="Manifest-Hölle ">Manifest-Hölle &#8220;…MSVCR80.dll nicht gefunden…&#8221;</a> (siehe Nachtrag)</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2007/03/22/warum-man-seine-libraries-mit-_crt_noforce_manifest-erzeugen-sollte/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

