2009-08-22 6 views
1

Je sais que le titre n'a pas beaucoup de sens, surtout parce qu'il est difficile à expliquer en une seule ligne. Donc, voici la situation:Vérifier si DWM/Aero est activé, et avoir ce code dans le même binaire pour 2000/XP/Vista/7

J'ai un programme dont le binaire est destiné à Windows 2000 et plus récent. Maintenant, je suis allé de l'avant et ajouté du code pour vérifier si l'utilisateur fonctionne sous Vista/7, et si oui, vérifiez si Aero/DWM est activé. Sur cette base, je vais désactiver certaines choses qui ne sont pas pertinentes pour cette plate-forme particulière, et activer d'autres fonctionnalités. Mon problème principal est que pour appeler DwmIsCompositionEnabled à partir de Visual C++ 2008, je dois ajouter le fichier dwmapi.lib et le compiler. Exécuter le binaire dans autre chose que Vista ou 7 donne l'erreur "Impossible de localiser le composant L'application n'a pas pu démarrer car dwmapi.dll n'a pas été trouvé". Ceci, bien sûr, devrait se produire puisque DWM est nouveau et n'est pas disponible pour les anciennes plates-formes.

Ma question est alors: est-il possible pour moi de réussir à m'en sortir? Un binaire pour toutes les versions d'OS ET inclure ce code de vérification DWM? Ce programme a été écrit sous Visual Studio 2008, Visual C++ à l'aide de MFC.

+1

Bien que je ne l'ai jamais fait moi-même, il est possible d'obtenir des fenêtres pour reporter à un autre binaire intégré dans le principal sous certaines conditions (l'utilisation la plus courante est un binaire 32 bits/64 bits unifié). en mode 64 bits à partir d'un binaire 32 bits par exemple). – ewanm89

+0

Microsoft semble appeler cette technique côte à côte assemblées et est documentée sur MSDN http://msdn.microsoft.com/en-us/library/ms235531.aspx, bien que la plupart de la documentation que je semble trouver sur elle semble spécifiquement reportez-vous à l'utiliser pour créer des DLL qui encapsulent plusieurs versions de bibliothèque. – ewanm89

+0

Merci pour les commentaires. Tu m'as conduit droit à la bonne réponse. – enriquein

Répondre

2

Il s'avère que je peux juste dire à l'éditeur de liens de différer le fichier dwmapi.dll. Je voudrais remercier ewanm89 parce que quelque chose qu'il a dit a résonné et m'a conduit sur le chemin pour trouver la réponse réelle.

+1

Oui, pendant que je dormais, je me demandais si vous pouviez juste charger la DLL sur la condition et pas besoin d'un second binaire ... – ewanm89

+1

Comme vous avez dormi! Impressionnant. –

1

La solution normale consiste à utiliser LoadLibrary() et GetProcAddress(). Les deux peuvent être effectués après le démarrage de votre programme. Mais encore +1 pour la solution DelayLoad, qui fait la même chose pour vous dans les coulisses.

Questions connexes