2010-12-21 10 views
0

Meine Anwendung (C++, kompiliert mit Mingw, hauptsächlich wxWidgets, Boost und SFML), die reibungslos unter Windows 7 oder Vista läuft, funktioniert nicht ordnungsgemäß auf Windows XP SP3. Ich habe eine manifest-Datei, die die ausführbare Datei ermöglicht die Verwendung von Windows XP/Vista/7 Look'n'Feel:Anwendung wird nicht mit XP SP3 und einem mit comctl32 verbundenen Manifest geladen

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly 
    xmlns="urn:schemas-microsoft-com:asm.v1" 
    manifestVersion="1.0"> 
<assemblyIdentity 
    name="Game Develop Editor.Release - Edittime.App" 
    processorArchitecture="x86" 
    version="1.0.0.0" 
    type="win32"/> 
<description>Executable</description> 
<dependency> 
    <dependentAssembly> 
     <assemblyIdentity 
      type="win32" 
      name="Microsoft.Windows.Common-Controls" 
      version="6.0.0.0" 
      processorArchitecture="x86" 
      publicKeyToken="6595b64144ccf1df" 
      language="*" 
     /> 
    </dependentAssembly> 
</dependency> 
</assembly> 

Wenn ich die Manifest-Datei entfernen/umbenennen, kann ich die ausführbare Datei mit Windows XP SP3 starten (Aber mit hässlichen veralteten Kontrollen). Wenn ich die Manifest-Datei lasse, läuft sie ohne Probleme mit Vista/7, aber mit Windows XP SP3 wird die Anwendung in den Speicher geladen (ich kann es im Task-Manager sehen), aber nichts tun. Keine Fehlermeldung, es stürzt nicht einmal ab.

Wenn ich es neu kompiliere, um eine Konsole anzuzeigen, zeigt letzteres nichts an.

Wenn ich gdb zum debuggen verwende, zeigt der Debugger "Startprogramm: ..." an und wird dann geblockt (Control + C funktioniert nicht).

Ich habe versucht, Dependency Walker auf der ausführbaren Datei zu verwenden.
Hier ist das Protokoll mit der Manifest-Datei: http://pastebin.com/J6T8KBH8
(Hier ist das Protokoll ohne das Manifest. http://pastebin.com/zrYzRaWE/In diesem Fall wird die Anwendung ohne Probleme geladen und läuft noch am Ende des Protokolls)

Ich habe die Zeile hervorgehoben, die in Dependency Walker in rot angezeigt wird, die sich auf eine fehlende Prozedur in comctl32 bezieht. Außerdem scheint das Protokoll ohne spezifische Fehler unterbrochen zu sein.

Haben Sie eine Idee, warum die Anwendung scheinbar ohne einen Absturz oder eine Meldung unterbrochen wird, wenn Sie ein Manifest verwenden?

Antwort

0

Es stellte sich heraus, dass das Problem nur bei Verwendung einer aktuellen Version der SFML-Bibliothek auftrat. Genauer gesagt, SFML-Bibliotheksnamen haben sich in einer aktuellen Version von "sfml-xxx.dll" in "sfml-xxx-2.dll" geändert.

Bei der Verknüpfung mit der neuesten Version der Bibliotheken mit dem neuen Namen möchte die Anwendung nicht auf Windows XP SP3 gestartet werden. Ich habe die CmakeList.txt-Datei optimiert, die verwendet wurde, um SFML zu kompilieren, um den alten Namen für die Bibliotheken (sfml-xxxx.dll) zu verwenden, und beim Verknüpfen mit diesen Bibliotheken funktioniert das Programm perfekt. Die einzige Sache, die anders ist, ist der Name der Bibliothek. In Dependency Walker habe ich jedoch gesehen, dass SFML-Bibliotheken bei Verwendung des neuen Namens (sfml-xxxx-2.dll) vor wxWidgets und Windows-bezogenen Bibliotheken angezeigt werden. Wenn ich den alten Namen (sfml-xxxx.dll) verwende, werden SFML-Bibliotheken am Ende der Liste präsentiert.