不同 Windows 版本的相同版本号

Same version number for different Windows versions

在这个page中,有这样的东西:

Windows Server 2008 6.0

Windows Vista 6.0

GetVersionEx() returns 版本号(即 6.0),但是如您所见,这个数字可以映射到两个不同的 Windows 版本!

那么有什么方法可以确切地知道我的Windows版本是什么?

一些version numbers对应于Windows的客户端和服务器版本。

您可以使用 IsWindowsServer 函数来区分 Windows 的客户端和服务器版本,将其与版本号结合起来就可以得到准确的版本。

但是,如果您要检测是否支持某些功能,则不推荐检查版本号,您可能需要使用 LoadLibraryGetProcAddress 来检查功能。

GetVersionInfoEx API returns a fully populated OSVERSIONINFOEX structure (if requested). The documentation 包含完整的 table,以及如何区分具有相同版本号的 OS 版本的说明:

The following table summarizes the values returned by supported versions of Windows. Use the information in the column labeled "Other" to distinguish between operating systems with identical version numbers.

对于您的特定示例,您需要将 OSVERSIONINFOEX.wProductTypeVER_NT_WORKSTATION 进行比较。如果相等,则您使用的是 Windows Vista,否则您使用的是 Windows Server 2008。

要获得 Windows 8.1 及更高版本的可靠结果,您的应用程序需要证明是兼容的。 Windows 8.1 及更高版本的应用程序说明可在 Targeting your application for Windows.

获得

示例清单文件:

<?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 foo 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 10 --> 
            <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
            <!-- 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>