wix - WiX:如何立即重启 explorer.exe?
问题描述
我是软件打包的初学者。我正在使用 cpack + Wix。我试图找到有用的信息或关于util:RestartResource的好文档,但找不到我的问题的任何 awnser。
问题: 我必须安装一个 ShellExtension,它需要在设置一些注册表值后重新启动 explorer.exe。因此,我使用命令(https://wixtoolset.org/documentation/manual/v3/xsd/util/restartresource.html):
<util:RestartResource ProcessName="explorer.exe"/>
一切几乎都像预期的那样工作。Explorer.exe 将按预期被杀死,但在用户完成安装后将触发 explorer.exe 的重新启动。这是令人不快的,因为 explorer.exe 会消失,直到用户单击安装的完成按钮。我想在设置注册表值后直接重新启动资源管理器。我知道这应该是可能的,因为如果 WiX 自己触发了 explorer.exe 的重启,它会立即执行,不会等到安装完成。诀窍是什么?我已经尝试过 CustomActions 并将util:RestartResource放在 WiX-Code 的不同位置(我很绝望。)。
[编辑]我正在分析安装日志。我意识到默认情况下,在进度开始时会调用一个重启管理器,并在最终对话框之前关闭自己。如果我将 ProcessName 添加到 RestartResource 它会打开另一个重新启动管理器,该管理器在最终对话框后关闭自己。需要了解如何像默认的 RestartResource 一样调用 RestartResource 。
[EDIT2]我猜util:RestartResource是错误的。目前,我抓取了 WiX 实现代码和 MSI 文档,通常您应该在状态“InstallValidate”之前注册所有 RestartResources。这正是 WiX 在UtilExtension_Platform.wxi中试图做的事情:
<Fragment>
<CustomAction Id="WixRegisterRestartResources$(var.Suffix)" BinaryKey="WixCA" DllEntry="WixRegisterRestartResources$(var.Suffix)" Execute="immediate" Return="check" SuppressModularization="yes" />
<InstallExecuteSequence>
<Custom Action="WixRegisterRestartResources$(var.Suffix)" Before="InstallValidate" Overridable="yes" />
</InstallExecuteSequence>
</Fragment>
因为在这个状态之后 MsiRestartManagerSessionKey 会被终止。在注册RestartResource的情况下,WiX 会尝试使用此密钥。但是我在日志中看到的是,我的util:RestartResource调用将始终在“InstallValidate”状态之后执行。并且日志此时已经表明,MsiRestartManagerSessionKey 已提前终止(在“InstallValidate”状态之后)。从我的角度来看,这是反对 MSI 政策的。
[EDIT3] 这不是错误的。我会发布一个遮阳篷。
解决方案
“重新启动资源管理器”的一种方法是重新启动系统。您可以为此使用 Forcereboot 元素。
在安装过程中提示用户重新启动系统。特殊动作没有内置序列号,因此必须相对于另一个动作出现。建议的方法是使用 Before 或 After 属性。InstallExecute 和 InstallExecuteAgain 可以选择出现在 InstallInitialize 和 InstallFinalize 之间的任何位置。
更多细节可以在这里找到:https ://wixtoolset.org/documentation/manual/v3/xsd/wix/forcereboot.html
另外:强制您不拥有的 Windows 进程重新启动似乎很危险。WiX 本身可能不支持它,因为您可能不应该这样做。:)
推荐阅读
- mysql - MYSQL 带有锁表的意外错误消息
- nginx - 在不破坏现有入口的情况下设置 Nginx 标头主机
- java - PDFBox:从页面深度克隆特定资源(ColorSpaces)
- ffmpeg - 如何从 ffserver 流式传输音频
- python-3.x - 如何使用 Python 在 csv 文件中导入特定键及其值?
- ios - 仅当应用程序在后台请求位置后进入前台时才调用 didUpdateLocations
- javascript - Mendeley JS SDK 客户端凭据流授权
- c# - (WIN32: 1400 ERROR_INVALID_WINDOW_HANDLE) 使用智能卡签署 CSR 时
- php - 如何通过爆炸生成键值并将匹配的键值排列到一个键中?
- nginx - Kubernetes NGINX Ingress 将 HTTP 请求从 POST 更改为 GET