推迟在 WiX 中安装

Postpone installation in WiX

我想创建行为如下的 WiX 安装程序: - 如果它发现程序实例已经安装并且当前 运行 它应该推迟安装直到下次重新启动。

WiX 如何实现这一点?

经过我的研究,我看到了以下可能性: - 如果程序实例是 运行

,则创建自定义操作并使用 MoveFileEx 和选项 MOVEFILE_DELAY_UNTIL_REBOOT

这是一个好方法还是应该使用其他解决方案?

更新 1

Additional info 那是个小问题。函数 ::MoveFileEx' 需要访问注册表的权限才能存储值。

If the dwFlags parameter specifies MOVEFILE_DELAY_UNTIL_REBOOT, MoveFileEx fails if it cannot access the registry. The function stores the locations of the files to be renamed at restart in the following registry value:

您可能正在尝试解决 Windows 已经解决的问题。

(MoveFile 似乎无关紧要,因为 Windows 正在安装这些文件,而不是你。无论如何,Windows 应用版本规则并且不会用较低版本(或相同版本)替换现有版本文件散列,如果未版本化)所以你已经没有遵循标准安装规则。)

如果您安装了安装程序并且它需要替换该文件或任何其他文件,那么可能会发生以下几种情况:

  1. 它将显示一个正在使用的文件对话框。您可以告诉人们在完成该程序之前忽略它,然后通过单击 "Retry" 将其关闭并继续安装,无需重新启动。在他们完成程序之前,安装实际上已暂停。

  2. 它将显示一个正在使用的文件对话框,您告诉他们单击“忽略”,这样安装将继续,最后可能会要求重新启动。用户推迟重启,直到他们完成程序。

  3. 抑制正在使用的文件对话框,如果需要重新启动,它会在最后要求重新启动,不显示正在使用的文件对话框,只是请求重新启动用户在准备好时执行。

您将某些事情推迟到下一次重新启动的问题是,这通常需要在注册表的 RunOnce 键或程序菜单启动文件夹中输入一个条目,并且 Windows 不想 运行 提升程序会自动那样。一些 AV 软件也不喜欢写入这些位置。因此,任何需要在重新启动时自动 运行 提升程序的解决方案都可能存在问题。

话虽如此,如果您想发明自己的解决方案,我认为这与 WiX 或 Windows 安装程序没有任何关系。您编写了一个程序来检查另一个程序是否正在 运行ning。您可以通过 运行ning 您的程序开始安装。如果其他程序不是 运行ning,请开始安装,然后就完成了。如果该其他程序是 运行ning,您可以在“开始”菜单的“启动”文件夹或 RunOnce 注册表位置获取您的程序,然后它会在重新启动后重新启动,然后您再次查看该程序是否 运行ning,如果没有,则开始安装,并删除 Startup/RunOnce 条目。