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>
我有一个安装程序可以部署 运行 一个单独的 .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>