平台
客户端 - Windows 8.1 服务器 - Windows Server 2012 R2
说明
由于过去使用 GetVersion (Ex) Windows 8.1 API,GetVersion (Ex) API 的工作方式发生了一些重大变化。
在早期版本的 Windows 中,调用 GetVersion (Ex) API 将返回操作系统的实际版本 (OS) ,除非应用兼容性填充码缓解了该过程,以使其具有不同的版本。 这是临时完成的,在 Microsoft 在发布中可以合理填充的进程数量方面相对不完整。 许多应用程序都通过裂缝,因为它们由于设计不佳的版本检查而没有得到填充。
执行版本检查的第一个原因是显示应用程序的 OS 可支持性的消息。 但由于检查不佳,消息通常会显示需要在 XP 或更高版本上运行的应用,当然这是最新的 OS。 通常,最新的 OS 会运行应用程序,如果没有进行这些检查,则不会出现任何问题。
表现
在Windows 8.1中,已弃用 GetVersion (Ex) API。 这意味着,尽管仍可以调用 API,但如果应用未专门面向Windows 8.1,则会收到Windows 8版本控制 (6.2.0.0) 。
解决方案
若要以Windows 8.1为目标,需要在源文件中包含应用清单或包括 _NT_TARGET_VERSION=$ (_NT_TARGET_VERSION_LATEST) 。
这是应用清单的外观:
<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=SXS_ASSEMBLY_NAME
version=SXS_ASSEMBLY_VERSION
processorArchitecture=SXS_PROCESSOR_ARCHITECTURE
/>
<description> my app exe </description>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="asInvoker"
uiAccess="false"
/>
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
* <!-- Windows 8.1 -->
* <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
</application>
</compatibility>
</assembly>
然后将其添加到源:
SXS_MANIFEST_RESOURCE_ID=1 SXS_MANIFEST=foo.manifest SXS_ASSEMBLY_NAME=Microsoft.Windows.Foo SXS_ASSEMBLY_VERSION=1.0 SXS_ASSEMBLY_LANGUAGE_INDEPENDENT=SXS_MANIFEST_IN_RESOURCES 1 for Windows 8.1,上面用星号 (*) 标记的两行说明如何准确面向操作系统Windows 8.1版本的应用程序。 在以前的操作系统上运行时,清单Windows 8.1的.exe不会产生任何影响。 如果已定义 .rc 文件,还可以将其添加到 .rc 文件。
添加 trustInfo 并不重要,但强烈建议这样做。 无论操作系统是Windows 8.1还是Windows 8,.exe都会始终获得正确的版本。
替换 API 称为 VersionHelpers。 它们非常易于使用;你只需#include <VersionHelpers.h>。
示例
VersionHelpers.h 头文件中提供的内联函数使你能够在测试 Windows 版本时返回布尔值来验证操作系统的版本。 例如,如果应用程序需要Windows 8或更高版本,请使用以下测试:
#include <VersionHelpers.h>
…
if (!IsWindows8OrGreater())
{
MessageBox(NULL, "You need at least Windows 8", "Version Not Supported", MB_OK);
}
可用的 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 IsWindows8_1OrGreater () VERSIONHELPERAPI IsWindowsServer () 它们将返回 TRUE 或 FALSE,具体取决于所问的问题,并且只需定义支持的最小级别操作系统。