Windows 版本检查

操作系统版本随Windows 10 OS 版本递增。 这意味着Windows 10的内部版本号也已更改为 10.0。 同过去一样,在 OS 版本更改后我们将尽力维护应用程序和设备兼容性。 对于大多数应用类别 (没有任何内核依赖项,) 更改不会对应用功能产生负面影响,并且现有应用将继续在Windows 10上正常工作。

表现

此更改的体现特定于应用。 这意味着专门检查 OS 版本的任何应用将获得更高的版本号,这可能会导致出现以下一个或多个情形:

  • 应用安装程序可能无法安装应用,并且应用可能无法启动。
  • 应用可能会变得不稳定或崩溃。
  • 应用可能会生成错误消息,但仍继续正常运行。

某些应用执行版本检查,只向用户传递一条警告。 但有些应用与版本检查紧密相连(在驱动程序中,或在内核模式下,以避免检测)。 在这些情况下,如果找到的版本不正确,应用将失败。 不使用版本检查,我们建议采用以下方法之一:

  • 如果应用依赖于特定的 API 功能,请确保找准正确的 API 版本。
  • NTDDI (NT 设备驱动程序接口) 版本号仅在 API 中的目标功能发生更改时才递增。 确保通过 APISet 或其他公开的 API(由功能团队创建)检测更改,并且不要将版本用作某些功能或修补程序的代理。 如果存在重大更改,而正常检查未检测到,则表明存在 Bug。
  • 确保应用不会以奇怪的方式检查版本,例如通过注册表、文件版本、偏移量、内核模式、驱动程序或其他方式。 如果应用绝对需要检查版本,请使用 GetVersion API,该 API 应返回主要版本号、次要版本号和内部版本号。
  • 如果使用 GetVersion API 或其他版本帮助程序函数(如 VerifyVersionInfo),请记住,此 API 的行为自Windows 8.1以来已更改。 有关更多详细信息 ,请参阅 API 文档
  • 如果你拥有反恶意软件或防火墙等应用,则应通过通常的反馈渠道和 Windows 预览体验计划工作。

应用清单

下面是一个示例应用清单:

<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 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>

将这些变量添加到源:

  • SXS_MANIFEST_RESOURCE_ID=1
  • SXS_MANIFEST=foo.manifest
  • SXS_ASSEMBLY_NAME=Microsoft.Windows.Foo
  • SXS_ASSEMBLY_VERSION=1.0
  • SXS_ASSEMBLY_LANGUAGE_INDEPENDENT=1
  • SXS_MANIFEST_IN_RESOURCES=1

对于Windows 10,上面标有星号的两行 (*) 显示如何准确定位应用程序的操作系统Windows 10版本。 在早期版本的 Windows 操作系统上运行时,清单Windows 10.exe不会产生任何影响。 如果已定义 .rc 文件,还可以将其添加到 .rc 文件中。 添加 trustInfo 并不重要,但强烈建议这样做。 这将允许你的.exe始终获取正确的版本,无论操作系统是Windows 10还是Windows 8.1。

资源