Änderungen der Betriebssystemversion in Windows 8.1 und Windows Server 2012 R2
Plattformen
Clients – Windows 8.1
Server– Windows Server 2012 R2
BESCHREIBUNG
Wir haben einige wichtige Änderungen an der Funktionsweise der GetVersion(Ex)-APIs in Windows 8.1 aufgrund unerwünschter Kundenverhalten vorgenommen, die sich aus der Verwendung der GetVersion(Ex)-APIs in der Vergangenheit ergeben.
In früheren Versionen von Windows wurde beim Aufrufen der GetVersion(Ex)-APIs die tatsächliche Version des Betriebssystems zurückgegeben, es sei denn, der Prozess wurde durch einen App-Compat-Shim entschärft, um ihm eine andere Version zu geben. Dies wurde auf vorläufiger Basis durchgeführt und war relativ unvollständig, was die Anzahl der Prozesse angeht, die Microsoft in einer Version vernünftigerweise abschneißen konnte. Viele Anwendungen fielen durch die Risse, weil sie aufgrund von schlecht gestalteten Versionsüberprüfungen nicht shimmed wurden.
Der Hauptgrund für eine Versionsprüfung besteht darin, den Benutzer zu warnen, dass die Anwendung unter einer neueren Version des Betriebssystems ausgeführt werden muss. Aufgrund von schlechten Überprüfungen würden Apps jedoch häufig fälschlicherweise davor warnen, dass sie unter Windows XP oder höher ausgeführt werden müssen, was natürlich das neueste Betriebssystem ist. In den meisten Fällen würde das neueste Betriebssystem die Anwendung ohne Probleme ausführen, wenn diese Überprüfungen nicht durchgeführt werden.
Manifestation
In Windows 8.1 sind die GetVersion(Ex)-APIs veraltet. Das bedeutet, dass Sie diese API-Funktionen zwar weiterhin aufrufen können, aber wenn Ihre App nicht speziell auf Windows 8.1 ausgerichtet ist, geben die Funktionen die Windows 8 Version (6.2) zurück.
Lösung
Hinzufügen eines App-Manifests
Damit Ihre App auf Windows 8.1 ausgerichtet ist, müssen Sie ein App-Manifest (ausführbare Datei) für die ausführbare Datei der App einschließen. Anschließend müssen Sie im <Kompatibilitätsabschnitt> des Manifests für jede Windows-Version, die Sie deklarieren möchten, die von Ihrer App unterstützt wird, ein <unterstütztesOS-Element> hinzufügen.
Das folgende Beispiel zeigt eine App-Manifestdatei für eine App, die alle Versionen von Windows von Windows Vista bis Windows 8.1 unterstützt:
<!-- 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>
Die oben markierte * ADD THIS LINE *
Zeile zeigt, wie Sie Ihre Anwendung auf Windows 8.1 genau ausrichten.
Das Deklarieren der Unterstützung für Windows 8.1 in Ihrem App-Manifest hat keine Auswirkungen auf die Ausführung Ihrer App unter früheren Betriebssystemen.
Verwenden von VersionHelpers anstelle von GetVersion(Ex)
Windows 8.1 führt neue Ersetzungs-API-Funktionen für GetVersion(Ex) ein, die als VersionHelpers bezeichnet werden. Sie sind extrem einfach zu bedienen; Alles, was Sie tun müssen, ist #include <VersionHelpers.h>
. Die in der Headerdatei VersionHelpers.h verfügbaren Inlinefunktionen ermöglichen es Ihrem Code, zu fragen, ob das Betriebssystem eine bestimmte Version von Windows oder höher ist.
Beispiel Wenn Ihre Anwendung beispielsweise Windows 8 oder höher erfordert, verwenden Sie den folgenden Test:
#include <VersionHelpers.h>
// ...
if (!IsWindows8OrGreater())
{
MessageBox(NULL, "You need at least Windows 8", "Version Not Supported", MB_OK);
}
Die verfügbaren Funktionen der VersionHelper-API sind:
#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();
Je nachdem, welche Frage Sie stellen, wird TRUE oder FALSE zurückgegeben, und Sie müssen nur das von Ihnen unterstützte Betriebssystem der Mindestebene definieren.