在卸载期间终止我的应用程序

时间:2013-11-11 16:43:40

标签: wix

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

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

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

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

问题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。

1 个答案:

答案 0 :(得分:1)

我的想法很少,即:

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

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

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

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