Was bewirkt ein Manifest?



  • Aloha,

    ich habe nun vielerorts gelesen, daß ein Manifest dazu dient, daß eine Anwendung ihre Steuerelemente im Stil von WinXP darstellt.
    Um zu verstehen, wie das funktioniert, habe ich damit ein bißchen herumgespielt, um festzustellen, daß ich nix verstehe ...

    Ich habe eine Anwendung namens test.exe und in den Ordner ein Manifest namens test.exe.manifest gelegt. Das Manifest sieht wie folgt aus:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity
        version="1.0.0.0"
        processorArchitecture="*"
        name="XP Beautifier"
        type="win32"
    />
    
    <description>Adds XP Theme style to any program</description>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="*"
                publicKeyToken="6595b64144ccf1df"
                language="*"
            />
        </dependentAssembly>
    </dependency>
    </assembly>
    

    Wenn ich test.exe starte (WinXP SP3), dann sieht die Anwendung auch schön XP-stylish aus. Allerdings sieht sie genau so aus, wenn ich die Manifest-Datei entferne.
    Stelle ich mein XP auf das Design "Windows-klassisch" um, dann erscheint die Anwendung im klassischen Stil, eckige Anwendungsfenster usw.
    Aber das ist nicht abhängig davon, ob die Manifest-Datei im Ordner liegt.

    Also, entweder stimmt etwas mit der Manifest-Datei nicht (siehe oben), oder aber ich habe das ganze Thema überhaupt nicht verstanden.
    Vielleicht kann mich hier jemand erhellen.



  • Nachtrag:

    Ich habe die Manifest-Datei testweise umbenannt in UEDIT32.exe.manifest, und in den Ordner gelegt, wo die entsprechende exe des UltraEdit - Editors liegt. Wenn ich den UEdit nun starte, kann ich tatsächlich eine marginale Veränderung zum Normalzustand sehen, die Toolbar ist irgendwie etwas 'verhunzt', also 'irgendwas' bewirkt die Manifest-Datei, aber ohne etwas mehr Verständnis über die Zusammenhänge kann ich das nicht gezielt verwenden ...



  • Nochmal Nachtrag:

    Ich habe die M.-Datei nochmal umbenannt, und zu einer exe gelegt, die ein paar Buttons hat. Hier (und bei einer Listbox) sehe ich nun tatsächlich einen Unterschied.

    Daraus folgt nun gleich meine nächste Frage:
    Ich weiß, daß man die Manifest-Datei auch direkt mit in die exe linken kann. Ich weiß nur nicht, wie das funktioniert.

    Ich benutze VS 2008 Express und wenn ich dort die Einstellungen zur Manifest-Datei aktiviere, dann wird eine ProgName.exe.intermediate.manifest erzeugt, von der ich glaube, daß sie anschließend in die ProgName.exe gelinkt wird. So weit, so gut. Allerdings sieht diese intermediate.manifest - Datei anders aus, als die oben gepostete, sie ist nur halb so lang, dementsprechend enthält sie weniger Informationen und bewirkt eben nicht, daß meine Buttons XP-stylish aussehen.

    Frage nun: Wie bekomme VS 2008 Express dazu, die oben gepostete Manifest-Datei in die Zielanwendung zu linken, oder aber selbst eine solche als intermediate zu erstellen und dann dazu zu linken?


  • Mod

    Bei VS-2010 musst Du auch im Code, angeben, dass die COMCTL 6.0 verwendet wird. Dazu steht normaleweise ein pragma in der stdafx.cpp

    #if defined _M_IX86
    #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
    #elif defined _M_IA64
    #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
    #elif defined _M_X64
    #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
    #else
    #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
    #endif
    

    Ein Manifest mag erzeugt werden aber eben keines, dass die entsprechende DLL lädt.

    Zur Erklärung: Ein Manifest ist eine Regel, welche DLL Version einer bestimmten DLL aus dem WinSxS Verzeichnis geladen wird, oder ob eben WinSxS gar nicht verwendet wird.
    Ohne Manifest wird die COMCTL32 Version 5.x geladen. Mit Manifest die Version 6.x

    Nur in der Version 6.x werden die Radio Button, Button, Groupboxen auch im neuen Stil angezeigt.



  • Danke sehr!
    Dein Pragma-Beispiel hat mir geholfen!
    Wenn ich in VS 2008 Express unter Linker-Einstellungen/Zusätzliche Manifestabhängigkeiten folgenden String eingebe:

    name='Microsoft.Windows.Common-Controls' type='win32' version='6.0.0.0' processorArchitecture='' publicKeyToken='6595b64144ccf1df' language=''

    dann erhalte ich das gewünschte Ergebnis: eine exe - Datei mit eingebettetem Manifest, die die XP-Style - Controls darstellt.


Anmelden zum Antworten