2

我在尝试完成以下操作时遇到了具有挑战性的问题:我的应用程序安装了一个服务(watchdog.exe)和一个 exe 文件(app.exe)。

安装完成后,服务启动并创建进程“app.exe”。

在卸载期间,我想杀死进程“app.exe”(它在本地系统帐户下运行,所以我必须以管理员身份运行)。

问题 1:安装说它需要重新启动,因为它看到文件“app.exe”在 CostFinalize 阶段被保留(运行)(如果我对检查是否重新启动的阶段有误,请纠正我将是必需的)。在卸载开始时终止该进程会更好。我已经验证,如果在卸载过程中进程没有运行,那么安装不会抱怨需要重新启动。

问题2:使用自定义操作杀死进程是有问题的。该操作必须运行提升,但另一方面它必须在 costFinalize 之前运行(否则 - 它回到问题 1)。

我会很感激任何建议。此外,任何替代解决方案(是否有另一种方法可以在安装过程中关闭进程而无需重新启动?)

我现在拥有的自定义操作代码(不好,因为它既不必要地要求重新启动,又由于缺乏权限而无法终止进程):

<InstallExecuteSequence>
  <!--<ScheduleReboot After="InstallFinalize" />-->
  <Custom Action="MyProcess.TaskKill" Before="InstallValidate"></Custom>
</InstallExecuteSequence>

<!--<Property Id="Net">Net.exe</Property>-->
<Property Id="QtExecCmdLine" Value='"[%SYSTEMROOT]\System32\taskkill.exe" /F /IM App.exe' />
<CustomAction Id="MyProcess.TaskKill"
              BinaryKey="WixCA"
              DllEntry="CAQuietExec"
              Execute="immediate"
              Return="ignore" />

这是失败的日志:

CAQuietExec:错误 0x80070001:命令行返回错误。CAQuietExec:错误 0x80070001:CAQuietExec 失败 CustomAction MyProcess.TaskKill 返回实际错误代码 1603(请注意,如果在沙箱内进行翻译,这可能不是 100% 准确) 操作于 18:15:54 结束:MyProcess.TaskKill。返回值 1603。

4

1 回答 1

1

我有几个想法,即:

  • 使用 EventWaitHandles,它允许进程相互通信,并将您的愿望委托给 app.exe。然后,您的 app.exe 可以根据需要终止。这是干净的解决方案,应该是首选。

如果出于某种原因您决定杀死应用程序,就像您根本不关心世界上的任何事情一样,那么您可以:

  • 我今天看到一个可以在所有阶段完全提升 MSI 运行的项目。它是 Visual Stdio 模板,但我现在找不到它,但知道它存在那里。您也可以使用它,也许它可以工作:如何让 WiX 安装程序请求管理权限?

基本上你可以做很多黑客技巧来杀死应用程序。例如使用 WiX Burn 并要求管理权限,然后做你的事。我会选择解决方案#1(创建自己的机制)

顺便说一句,如果您在 WiX 中使用 ServiceControl 元素,它将在重新安装/卸载之前停止服务。您可以挂接到服务中的 OnStop() 方法并在那里杀死您的 App.exe。如果您已将 Service 设置为 App.exe 父级,则应该有任何子进程与父级一起死亡的标志。

于 2013-11-11T19:59:12.177 回答