Изменения версий операционной системы в Windows 8.1 и Windows Server 2012 R2
Платформы
Клиенты — Windows 8.1
Серверы — Windows Server 2012 R2
Description
Мы внесли некоторые значительные изменения в способе работы API GetVersion(Ex) в Windows 8.1 из-за нежелательных действий клиентов, вызванных использованием API GetVersion(Ex) в прошлом.
В предыдущих версиях Windows вызов API GetVersion(Ex) вернет фактическую версию операционной системы (ОС), если процесс не был устранен компотом приложения, чтобы дать ему другую версию. Это было сделано на временной основе и было относительно неполным с точки зрения количества процессов, которые корпорация Майкрософт могла бы разумно похитить в выпуске. Многие приложения упали через трещины, потому что они не получили дерьм из-за плохо разработанных версий проверка.
Номер одной причины для проверка версии заключается в том, чтобы предупредить пользователя о том, что приложение должно работать в более новой версии ОС. Однако из-за плохих проверка приложения часто предупреждают, что они должны работать в Windows XP или более поздней версии, что, конечно, является самой новой ОС. Чаще всего новейшая ОС будет запускать приложение без каких-либо проблем, если не для этих проверка.
Проявление
В Windows 8.1 и более поздних версиях API GetVersion(Ex) устарели. Это означает, что в то время как вы по-прежнему можете вызывать эти функции API, если ваше приложение не предназначено для Windows 8.1, функции будут возвращать версию Windows 8 (6.2).
Решение
Добавление манифеста приложения
Чтобы приложение предназначено для Windows 8.1, необходимо включить манифест приложения (исполняемого файла) для исполняемого файла приложения. Затем в <разделе совместимости> манифеста необходимо добавить поддерживаемый< элементOS> для каждой версии Windows, которую вы хотите объявить, что ваше приложение поддерживает.
В следующем примере показан файл манифеста приложения для приложения, поддерживающего все версии Windows из 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>
В приведенной выше строке показано * ADD THIS LINE *
точное назначение приложения для Windows 8.1.
Объявление поддержки Windows 8.1 в манифесте приложения не будет иметь никакого эффекта при запуске приложения в предыдущих операционных системах.
Использование VersionHelpers вместо GetVersion(Ex)
В Windows 8.1 представлены новые функции API замены для GetVersion(Ex), известные как VersionHelpers. Они очень просты в использовании; все, что вы должны сделать, это #include <VersionHelpers.h>
. Встроенные функции, доступные в файле заголовка VersionHelpers.h, позволяют коду задавать, является ли операционная система заданной версией Windows или более поздней.
Например , если приложению требуется Windows 8 или более поздняя версия, используйте следующий тест:
#include <windows.h>
#include <VersionHelpers.h>
// ...
if (!IsWindows8OrGreater())
{
MessageBox(NULL, "You need at least Windows 8", "Version Not Supported", MB_OK);
}
Доступные функции API VersionHelper:
#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();
Они возвращают значение TRUE или FALSE в зависимости от запрашиваемого вопроса, и необходимо определить только поддерживаемую операционную систему минимального уровня.