WIX 工具集 - 自定义操作命令无法正确检测 Windows 10 版本

WIX Toolset - Custom Action command doesn't correctly detect Windows 10 version

我有一个安装程序可以部署 运行 一个单独的 .exe 文件来将驱动程序部署到系统。不幸的是,Microsoft 似乎在 Windows 10 及以后版本中放弃了对 VersionNT 宏的支持,:编写一个函数来查询 kernel32.dll 的版本号,并与标记值 (10.0.10240.16384).

关键在于:当我直接从管理控制台 运行 此命令时,该命令正确检测到 Windows 的版本我是 运行ning.

Current Windows Version: 10.0.10240.16384 - Cutoff Version: 10.0.10240.16384

但是,当命令作为自定义操作从我的 WIX 工具集安装程序执行时,它似乎认为我使用的是旧版本的 Windows。在这一点上,我最好的猜测是安装程序或自定义操作命令 运行 在某种自动兼容模式下运行。

Current Windows Version: 6.2.10240.16384 - Cutoff Version: 10.0.10240.16384

我该如何进行? VersionNT 的放弃令人沮丧,因为新版本 API(即:IsWindows10OrGreater())仅适用于 Win10 或更高版本,因此在旧机器上我必须 dlopen/dlsym并测试失败。我不知道为什么创建一个简单的 int return_OS_Version(major, minor, release, revision,) 函数如此困难。

这有点骇人听闻(他们做这个,我们做那个......)但危急时刻需要采取危急措施....

在 MSFT 玩的所有兼容性游戏中,它们似乎只屏蔽了 Major 和 Minor,但没有屏蔽 Build 和 revision。我还发现在 Win8 上他们将其屏蔽为 6.2,而在 Win 10 上他们将其屏蔽为 6.3。所以我觉得这样做很舒服:

<Property Id="WIN10FOUND">
  <DirectorySearch Id="searchSystem" Path="[SystemFolder]" Depth="0">
    <FileSearch Id="searchFile" Name="advapi32.dll" MinVersion="6.3.10000.0"/>
  </DirectorySearch>
</Property>

也可以使用 RegistrySearch 检测 Windows 10。例如,节点 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion 包含 CurrentBuild 和 CurrentBuildNumber 值。对于 Windows 8.1 或 Windows Server 2012R2,这些值是 9600,对于 Windows 10,它们很可能是 14393。

<Property Id="WINDOWSBUILDNUM" Secure="yes">
  <RegistrySearch Id="YOUR_ID_HERE" Root="HKLM" Key="SOFTWARE\Microsoft\Windows NT\CurrentVersion" Name="CurrentBuild" Type="raw" />
</Property>

得到一个值可以这样处理,以便安装特定于 Windows 10 的文件:

<Component Id="YOUR_ID_HERE" Guid="YOUR_GUID_HERE" DiskId="1">
    <Condition><![CDATA[Installed OR (WINDOWSBUILDNUM > 9999)]]></Condition>
    <File Id="YOUR_ID_HERE" Name="Api.dll" Source="$(var.SolutionDir)\TheRestOfThePath\Api_for_win_10.dll"/>        
</Component>