Changements de version du système d’exploitation dans Windows 8.1 et Windows Server 2012 R2
Plateformes
Clients - Windows 8.1
Serveurs - Windows Server 2012 R2
Description
Nous avons apporté des modifications importantes au fonctionnement des API GetVersion(Ex) dans Windows 8.1 en raison de comportements clients indésirables résultant de la façon dont les API GetVersion(Ex) ont été utilisées dans le passé.
Dans les versions précédentes de Windows, l’appel des API GetVersion(Ex) renvoyait la version réelle du système d’exploitation, sauf si le processus avait été atténué par un shim de compatibilité d’application pour lui donner une version différente. Cette opération a été effectuée à titre provisoire et était relativement incomplète en ce qui concerne le nombre de processus que Microsoft pouvait raisonnablement shimer dans une version. De nombreuses applications sont tombées entre les mailles parce qu’elles n’ont pas été shimées en raison de vérifications de version mal conçues.
La première raison d’effectuer une version case activée est d’avertir l’utilisateur que l’application doit s’exécuter sur une version plus récente du système d’exploitation. Toutefois, en raison de vérifications médiocres, les applications avertissaient souvent à tort qu’elles devaient être exécutées sur Windows XP ou une version ultérieure, ce qui est bien sûr le système d’exploitation le plus récent. Le plus souvent, le système d’exploitation le plus récent exécute l’application sans aucun problème si ce n’est pas pour ces vérifications.
Manifestation
Dans Windows 8.1, les API GetVersion(Ex) ont été dépréciées. Cela signifie que même si vous pouvez toujours appeler ces fonctions d’API, si votre application ne cible pas spécifiquement Windows 8.1, les fonctions retournent la version Windows 8 (6.2).
Solution
Ajout d’un manifeste d’application
Pour que votre application cible Windows 8.1, vous devez inclure un manifeste d’application (exécutable) pour l’exécutable de l’application. Ensuite, dans la <section compatibilité> du manifeste, vous devez ajouter un <élément supportedOS> pour chaque version de Windows que vous souhaitez déclarer prise en charge par votre application.
L’exemple suivant montre un fichier manifeste d’application pour une application qui prend en charge toutes les versions de Windows, de Windows Vista à Windows 8.1 :
<!-- example.exe.manifest -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<assemblyIdentity
type="win32"
name="Contoso.ExampleApplication.ExampleBinary"
version="1.2.3.4"
processorArchitecture="x86"
/>
<description>Contoso Example Application</description>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> <!-- * ADD THIS LINE * -->
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
</application>
</compatibility>
</assembly>
La ligne ci-dessus marquée * ADD THIS LINE *
montre comment cibler avec précision votre application pour Windows 8.1.
La déclaration de la prise en charge des Windows 8.1 dans le manifeste de votre application n’aura aucun effet lors de l’exécution de votre application sur les systèmes d’exploitation précédents.
Utilisation de VersionHelpers au lieu de GetVersion(Ex)
Windows 8.1 introduit de nouvelles fonctions d’API de remplacement pour GetVersion(Ex), appelées VersionHelpers. Ils sont extrêmement faciles à utiliser; tout ce que vous avez à faire est #include <VersionHelpers.h>
. Les fonctions inline disponibles dans le fichier d’en-tête VersionHelpers.h permettent à votre code de vous demander si le système d’exploitation est une version donnée de Windows ou une version ultérieure.
Exemple Par exemple, si votre application nécessite Windows 8 ou une version ultérieure, utilisez le test suivant :
#include <VersionHelpers.h>
// ...
if (!IsWindows8OrGreater())
{
MessageBox(NULL, "You need at least Windows 8", "Version Not Supported", MB_OK);
}
Les fonctions d’API VersionHelper disponibles sont les suivantes :
#define VERSIONHELPERAPI FORCEINLINE BOOL
VERSIONHELPERAPI IsWindowsXPOrGreater();
VERSIONHELPERAPI IsWindowsXPSP1OrGreater();
VERSIONHELPERAPI IsWindowsXPSP2OrGreater();
VERSIONHELPERAPI IsWindowsXPSP3OrGreater();
VERSIONHELPERAPI IsWindowsVistaOrGreater();
VERSIONHELPERAPI IsWindowsVistaSP1OrGreater();
VERSIONHELPERAPI IsWindowsVistaSP2OrGreater();
VERSIONHELPERAPI IsWindows7OrGreater();
VERSIONHELPERAPI IsWindows7SP1OrGreater();
VERSIONHELPERAPI IsWindows8OrGreater();
VERSIONHELPERAPI IsWindows8Point1OrGreater();
VERSIONHELPERAPI IsWindowsServer();
Ils retournent TRUE ou FALSE en fonction de la question que vous posez, et vous devez uniquement définir le système d’exploitation de niveau minimal que vous prenez en charge.