Zmiany wersji systemu operacyjnego w systemach Windows 8.1 i Windows Server 2012 R2
Platformy
Klienci - Windows 8.1
serwery — Windows Server 2012 R2
Opis
Wprowadziliśmy pewne istotne zmiany w sposobie działania interfejsów API GetVersion(Ex) w systemie Windows 8.1 ze względu na niepożądane zachowania klientów wynikające z sposobu użycia interfejsów API GetVersion(Ex) w przeszłości.
W poprzednich wersjach systemu Windows wywołanie interfejsów API GetVersion(Ex) zwróci rzeczywistą wersję systemu operacyjnego, chyba że proces został skorygowany przez podkładkę aplikacji, aby nadać jej inną wersję. Zostało to zrobione na zasadzie tymczasowej i było stosunkowo niekompletne pod względem liczby procesów, które firma Microsoft mogła rozsądnie załatać w wydaniu. Wiele aplikacji zostało pominiętych, ponieważ nie zostały dostosowane z powodu źle zaprojektowanych sprawdzeń wersji.
Jedną z przyczyn sprawdzania wersji jest ostrzeżenie użytkownika, że aplikacja musi działać w nowszej wersji systemu operacyjnego. Jednak ze względu na słabe kontrole aplikacje często niepoprawnie ostrzegają, że muszą być uruchamiane w systemie Windows XP lub nowszym, co oczywiście jest najnowszym systemem operacyjnym. Zazwyczaj najnowszy system operacyjny uruchamia aplikację bez żadnych problemów, gdyby nie te kontrola.
Manifestacja
W systemie Windows 8.1 i nowszym API GetVersion(Ex) zostały wycofane. Oznacza to, że mimo że nadal można wywoływać te funkcje interfejsu API, jeśli aplikacja nie jest przeznaczona specjalnie dla systemu Windows 8.1, funkcje będą zwracać wersję systemu Windows 8 (6.2).
Rozwiązanie
Dodawanie manifestu aplikacji
Aby aplikacja była zgodna z systemem Windows 8.1, należy dołączyć manifest aplikacji dla pliku wykonywalnego aplikacji. Następnie w sekcji <zgodności> manifestu należy dodać element <obsługiwanego systemuOS> dla każdej wersji systemu Windows, którą chcesz zadeklarować, że aplikacja obsługuje.
Poniższy przykład przedstawia plik manifestu aplikacji dla aplikacji, która obsługuje wszystkie wersje systemu Windows z systemu Windows Vista do systemu 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>
Powyższy wiersz oznaczony * ADD THIS LINE *
pokazuje, jak dokładnie kierować aplikację do systemu Windows 8.1.
Deklarowanie obsługi systemu Windows 8.1 w manifeście aplikacji nie będzie miało żadnego wpływu podczas uruchamiania aplikacji w poprzednich systemach operacyjnych.
Używanie elementu VersionHelpers zamiast GetVersion(Ex)
System Windows 8.1 wprowadza nowe zastępcze funkcje interfejsu API dla polecenia GetVersion(Ex), znane jako VersionHelpers. Są one niezwykle łatwe w użyciu; wszystko, co musisz zrobić, to #include <VersionHelpers.h>
. Funkcje wbudowane dostępne w pliku nagłówkowym VersionHelpers.h umożliwiają Twojemu kodowi zapytanie, czy system operacyjny jest określoną wersją Windows lub nowszą.
Przykład Na przykład jeśli aplikacja wymaga systemu Windows 8 lub nowszego, użyj następującego testu:
#include <windows.h>
#include <VersionHelpers.h>
// ...
if (!IsWindows8OrGreater())
{
MessageBox(NULL, "You need at least Windows 8", "Version Not Supported", MB_OK);
}
Dostępne funkcje interfejsu API VersionHelper to:
#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();
Będą zwracać wartość TRUE lub FALSE w zależności od pytania, które zadajesz, i trzeba zdefiniować tylko minimalny poziom systemu operacyjnego, który obsługujesz.