我有一个安装程序,可以部署并运行单独的.exe
文件,以将驱动程序部署到系统。不幸的是,微软似乎已经放弃了对Windows 10及更高版本VersionNT
宏的支持,so I implemented an approach suggested in another post:编写一个函数来查询kernel32.dll
的版本号,并与哨兵值进行比较( 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,)
函数很难。
答案 0 :(得分:2)
这有点像黑客(他们这样做,我们这样做......)但是绝望的时候需要采取绝望的措施....
在MSFT正在播放的所有兼容性游戏中,他们似乎只是屏蔽了Major和Minor,而是构建和修改。我还得知在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>
答案 1 :(得分:1)
也可以使用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>