Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wix Windows 10上的VersionNT MSI属性_Wix_Windows Installer_Installshield - Fatal编程技术网

Wix Windows 10上的VersionNT MSI属性

Wix Windows 10上的VersionNT MSI属性,wix,windows-installer,installshield,Wix,Windows Installer,Installshield,我发现,当我更新引导程序的清单以支持Windows 10兼容性时,MSI的InstallUISequence将正确设置VersionNT=1000,但InstallExecuteSequence将设置VersionNT=603 如何使InstallExecuteSequence也设置VersionNT=1000?由于msiexec.exe在其清单中没有Windows 10兼容性,并且是一个,我知道没有干净的方法可以使执行序列参见VersionNT=1000。我建议采用以下方法之一: 在UI序列

我发现,当我更新引导程序的清单以支持Windows 10兼容性时,MSI的InstallUISequence将正确设置VersionNT=1000,但InstallExecuteSequence将设置VersionNT=603


如何使InstallExecuteSequence也设置VersionNT=1000?

由于
msiexec.exe
在其清单中没有Windows 10兼容性,并且是一个,我知道没有干净的方法可以使执行序列参见
VersionNT=1000
。我建议采用以下方法之一:

  • 在UI序列期间,将
    VersionNT
    复制到另一个属性(一些属性类似于
    REALVERSIONNT
    ;确保将其与要传递到执行序列的任何其他属性一样列出)
  • 从引导程序中传入实际值(同上),或
  • 如果在维护或卸载过程中需要相同的信息,可以在引导程序中设置注册表项,然后通过系统搜索将其值引入安装

(我被注册表项选项弄得左右为难,因为如果将来升级操作系统,它可能会过时。同时请注意,所有这些选项可能只与Windows理论未来版本中引导程序上的清单一样正确。)

这是我的两分钱

我不觉得VersionNT属性非常有用。VersionNT64是:VersionNT64。。。。不使用VersionNT64来确定位

这有点像黑客(他们做这个,我们做那个…),但绝望的时候需要采取绝望的措施

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

我倾向于问自己“为什么”我需要Windows(FOO)?然后,我查找一些注册表项或DLL,它们指示存在特定的功能、组件和API,并将其用于测试


微软采用了一种常青的方法,即“你不需要知道它是什么版本,你将始终拥有最新版本,它将始终被称为Windows 10”,对我来说,这强化了我更愿意采取的方法。我知道总有一天他们会错的,我需要知道,否则我会安装,我的应用程序会失败,我的用户会抱怨,不知道他们有什么版本。(叹气…

对于没有引导程序的安装程序,我发现创建一个立即自定义操作,调用并设置一个属性供安装程序的其余部分使用也是一个不错的选择。
我已将我的自定义操作排序为在AppSearch之后发生,这足以对组件进行调整。

我发现,检测Windows 10的一种非常简单而健壮的方法是调用内置的WMIC命令并解析其输出:

wmic操作系统获取名称、版本、构建编号/值

它将准确返回确定您使用的操作系统所需的信息:

BuildNumber=14393

版本=10.0。14393

在使用Windows 10的系统上,Windows Installer属性VersionNT 而VersionNT64表示603,最初作为 Windows 8.1的版本号。因此,不可能创建 .msi包中专门针对Windows 10的条件

自Windows Installer 5.0和Windows 7以来,DLL在.msi中的自定义操作 包被填隙以阻止获取操作系统版本; API GetVersion、GetVersionEx和RtlGetVersion返回一个Windows 版本6.0.6000,它最初是的版本号 WindowsVista。因此,也不可能获得实际数据 来自DLL自定义操作或来自 InstallScript自定义操作(作为DLL实现)

由于Windows Installer中的上述行为,它不是 轻松检测.msi所在的Windows版本 程序包正在运行


微软官方答复:

在Windows 10或Windows Server 2016上安装.msi安装包时,VersionNT值为603


我很感激这些建议。不幸的是,#1不适用于静默安装,#2和#3不适用于直接运行MSI…因为您需要支持所有这些使用模式,嗯,祝您好运!我认为目前的答案是这是不可能的。可能还有其他工件需要寻找,但微软已经明确决定,他们不希望人们在Windows安装程序包中检测到Windows 10。(我只希望他们能相应地更新VersionNT上的文档。)下面提供了我的两分钱。他们也应该更新AppSearch。我用minversion 10.0.0.0搜索了一个advapi32.dll,但没有检测到它。将minvision降至6.0.0.0,即可检测到它。浏览器说它的版本是10.0.10240.16384。WindowsBuild和MsiWin32AssemblySupport属性也是谎言!我认为这是有道理的(或者至少是我们最好的选择)。我们的安装程序目前关闭VersionNT属性以填充客户机中的数据库表,以便服务器机可以读取数据并向用户显示每个客户机是什么(在列表中)。我们将不得不找到一些有意义的东西来关闭前进的钥匙…@jbudreau似乎只有在安装过程中这样做,当那些在Windows 7或更高版本上安装您的程序的人在没有新安装的情况下升级Windows时,才会给您留下不准确的数据。如果你将其移动到应用程序中,你将同时解决这两个问题。同意。事实上,我刚刚做了几次就地升级,赢了8.1到10次升级,结果出人意料地好。我对这个答案不满意,不应该相信。SYSWOW64中不存在32位安装的内核32,其他dll(如advapi32.dll)也有其各自的功能