3

我有一个用 WiX 完成的安装程序。安装完成后,它会启动一个在 Explorer 进程中注入一些代码的应用程序。

目前,当我卸载时,重新启动管理器会启动并关闭我的应用程序和资源管理器。而不是我想手动关闭我的应用程序(这是通过在命令行上使用 -exit 再次运行它来完成的)。我有一个自定义操作可以做到这一点。

这是我到目前为止所尝试的:

<CustomAction ExeCommand="-exit" FileKey="MyApp.exe" Id="CloseMyApp" Impersonate="yes" Return="ignore" />

<InstallExecuteSequence>
    <RemoveExistingProducts After="InstallInitialize" />
    <Custom Action="CloseMyApp" Before="RemoveFiles" />
</InstallExecuteSequence>

这行不通。该操作在重新启动管理器会话之后完成。所以重启管理器弹出并要求关闭我的应用程序和资源管理器。该操作稍后运行,但到那时该应用程序已经消失了。

所以我尝试了这个:

<InstallExecuteSequence>
    <RemoveExistingProducts After="InstallInitialize" />
    <Custom Action="CloseMyApp" Before="RemoveExistingProducts" />
</InstallExecuteSequence>

这也行不通。行动仍然为时已晚。我还收到“警告 LGHT1076:ICE63:某些操作介于 InstallInitialize 和 RemoveExistingProducts 之间。”。

所以基本上 - 我如何在卸载期间和重新启动管理器会话之前执行我的自定义操作?

我猜如果我使用 Impersonate="no" 它可能会在正确的时间运行,但这不是一个选择。这是因为新进程必须为与必须关闭的进程相同的用户运行,因为它会查找其窗口并发送消息。如果进程属于不同的用户,这将更加棘手。

有任何想法吗?

4

1 回答 1

5

您需要在 InstallValidate 之前运行 CloseMyApp 自定义操作,因为那是处理重启管理器 ( doc ) 的时间。或者,您可以使用 MSIDISABLERMRESTART 或 MSIRESTARTMANAGERCONTROL 属性禁用重新启动管理器。

于 2010-07-11T01:19:04.087 回答