我有一个安装程序,它部署并运行一个单独的.exe
文件来将驱动程序部署到系统中。不幸的是,微软似乎已经放弃了对Windows 10及更高版本中VersionNT
宏的支持,所以我实现了另一篇文章中建议的方法:编写一个函数来查询kernel32.dll
的版本号,并与sentinel值(10.0.10240.16384
)进行比较。
问题是:当我直接从管理控制台运行此命令时,该命令会正确地检测到我运行的Windows版本。
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,)
函数如此困难。
也可以使用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="SOFTWAREMicrosoftWindows NTCurrentVersion" Name="CurrentBuild" Type="raw" />
</Property>
有了一个值,可以这样处理它,以便安装一个特定的Windows10文件:
<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)TheRestOfThePathApi_for_win_10.dll"/>
</Component>
这有点像黑客(他们这样做,我们那样做…),但绝望的时刻需要绝望的措施。。。。
在MSFT正在玩的所有兼容性游戏中,它们似乎只是掩盖了主要和次要,但构建和修订。我还计算出,在Win8上,他们将其屏蔽为6.2,而在Win10上,他们则将它屏蔽为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>