Windows 8.1 和 Windows Server 2012 R2 中的操作系統版本變更
平台
用戶端 - Windows 8.1
伺服器 - Windows Server 2012 R2
描述
我們已對 GetVersion(Ex) API 在 Windows 8.1 中的運作方式做了一些重大變更,因為過去 GetVersion(Ex) API 的使用方式導致客戶行為不理想。
在舊版的 Windows 中,呼叫 GetVersion(Ex) API 會傳回作業系統 (OS) 的實際版本,除非應用程式相容性填充碼已減輕此程式,以提供不同的版本。 這是暫時完成的,在 Microsoft 在發行中可以合理填充的程式數目方面相對不完整。 許多應用程式都因為設計不佳的版本檢查而沒有填充,所以許多應用程式都通過裂縫。
執行版本檢查的第一個原因是警告使用者應用程式需要在較新版本的作業系統上執行。 不過,由於檢查不佳,應用程式通常會錯誤地警告它們需要在 Windows XP 或更新版本上執行,這當然是最新的操作系統。 如果不是這些檢查,最新的 OS 會執行應用程式,而不會發生任何問題。
表現
在 Windows 8.1 和更新版本中,GetVersion(Ex) API 已被取代。 這表示雖然您仍然可以呼叫這些 API 函式,但如果您的 app 並未特別以 Windows 8.1 為目標,則函式會傳回 Windows 8 版本 (6.2)。
解決方案
新增應用程式指令清單
為了讓您的應用程式以 Windows 8.1 為目標,您必須包含 應用程式可執行檔案的應用程式 (可執行檔案) 指令清單 。 然後,在<指令清單的相容性>區段中,您必須為每個您想要宣告應用程式支援的 Windows 版本新增<支援的OS> 元素。
下列範例顯示應用程式指令清單檔案,可支援從 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)的新取代 API 函式,稱為 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);
}
可用的 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,而且您只需要定義您支援的最小層級操作系統。