我想创建一个行为如下的WiX安装程序: - 如果它发现程序实例已经安装并且当前正在运行它应该推迟安装直到下次重启。
如何通过WiX实现这一目标?
经过我的研究后,我发现以下可能性:
- 创建自定义操作,如果程序实例正在运行,则使用MoveFileEx
选项MOVEFILE_DELAY_UNTIL_REBOOT
这是一个好方法还是应该使用另一种解决方案?
更新1
附加信息是一个小问题。函数::MoveFileEx'
需要权限才能访问注册表以存储值。
如果dwFlags参数指定MOVEFILE_DELAY_UNTIL_REBOOT,则如果MoveFileEx无法访问注册表,则会失败。该函数将在重新启动时重命名的文件的位置存储在以下注册表值中:
答案 0 :(得分:2)
您可能正在尝试解决Windows已经解决的问题。
(MoveFile似乎无关紧要,因为Windows正在安装这些文件,而不是你。无论如何,Windows应用版本规则并且不会用较低版本替换现有版本(或者如果未版本化则替换相同的文件哈希),所以你已经不遵循标准安装规则。)
如果您安装设置并且需要替换该文件或其他任何文件,那么可以采取以下措施:
它将显示正在使用的文件对话框。您可以告诉人们在完成程序之前忽略它,然后通过单击“重试”关闭它并继续安装,不需要重新启动。安装有效暂停,直到他们完成程序。
它将显示一个使用中的文件对话框,告诉他们单击忽略,因此安装将继续,最后可能会要求重新启动。用户推迟重启直到他们完成程序。
取消正在使用的文件对话框,如果需要重新启动,它将在最后请求一个,没有显示使用中的文件对话框,只是请求用户在他们执行时重启'准备好了。
将问题推迟到下次重新启动的问题是,这通常需要在注册表的RunOnce密钥或Program Menus Startup文件夹中输入一个条目,并且Windows不希望像这样自动运行提升的程序。某些AV软件也不喜欢写入这些位置。因此,任何需要在重启时自动运行升级程序的解决方案都可能存在问题。
话虽如此,如果您想发明自己的解决方案,我认为这与WiX或Windows Installer无关。您编写了一个程序,用于检查其他程序是否正在运行。您可以通过运行程序来开始安装。如果其他程序没有运行,请开始安装,然后就完成了。如果正在运行其他程序,则会在“开始”菜单的“启动”文件夹或RunOnce注册表位置中获取程序,然后在重新启动后重新启动,然后再次查看程序是否正在运行,如果没有,则启动安装,然后删除你的Startup / RunOnce条目。