Поделиться через


Изменения версий операционной системы в 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 в зависимости от запрашиваемого вопроса, и необходимо определить только поддерживаемую операционную систему минимального уровня.

Ресурсы