gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 06:45:59 25 4
gpt4 key购买 nike

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

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

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

问题一:安装表明它需要重新启动,因为它看到文件“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: Error 0x80070001: Command line returned an error. CAQuietExec: Error 0x80070001: CAQuietExec Failed CustomAction MyProcess.TaskKill returned actual error code 1603 (note this may not be 100% accurate if translation happened inside sandbox) Action ended 18:15:54: MyProcess.TaskKill. Return value 1603.

最佳答案

我有几个想法,即:

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

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

基本上,您可以使用许多黑客技巧来终止应用程序。例如使用 WiX Burn 并需要管理权限,然后执行您的操作。我会选择解决方案#1(创建你自己的机制)

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

关于wix - 在卸载期间终止我的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19911522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com