Windows 8.1 和 Windows Server 2012 R2 中的操作系统版本变更

平台

客户端 - Windows 8.1

服务器 - Windows Server 2012 R2

说明

由于过去使用 GetVersion(Ex) API 的方式导致了不良客户行为,因此,我们对 GetVersion(Ex) API 在 Windows 8.1 中的工作方式进行了一些重大更改。

在以前版本的 Windows 中,调用 GetVersion(Ex) API 将返回操作系统 (OS) 的实际版本,除非应用兼容性填充码缓解了该过程以为其提供不同的版本。 这是临时完成的,并且就 Microsoft 可以在发行版中合理填充的进程数而言相对不完整。 许多应用程序被忽视,因为它们由于版本检查设计不当而未得到调整。

执行版本检查的首要原因是提示用户应用程序需要在较新版本的操作系统上运行。 然而,由于检查不当,应用经常会错误地提示他们需要在 Windows XP 或更高版本(当然是最新的操作系统)上运行。 如果不是这些检查,最新操作系统通常会毫无问题地运行此应用程序。

表现形式

Windows 8.1 及更高版本中已弃用 GetVersion(Ex) API。 这意味着,虽然你仍然可以调用这些 API 函数,但如果你的应用不是专门面向 Windows 8.1,则这些函数将返回 Windows 8 版本 (6.2)。

解决方案

添加应用清单

为了使你的应用面向 Windows 8.1,你将需要为应用的可执行文件包括应用(可执行文件)清单。 然后,在清单的<兼容性>部分中,你需要为要声明应用支持的每个 Windows 版本添加 <supportedOS> 元素。

以下示例显示了支持从 Windows Vista 到 Windows 8.1 在内的所有 Windows 版本的应用的应用清单文件:

<!-- 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 为 GetVersion(Ex) 引入了称为 VersionHelpers 的新替换 API 函数。 它们非常容易使用;你所要做的就是 #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);
    }

可用的 VersionHelper API 函数为:

#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,你只需定义支持的最低级别操作系统。

资源