提示用户在卸载期间关闭应用程序(在WiX中)

时间:2009-04-02 17:00:07

标签: wix uninstall

我正在使用Windows Installer XML 3.0(WIX3)来安装某些软件。

一切正常,但是,我很难处理以下用例:当用户尝试卸载仍在运行 >它。默认行为似乎删除了所有文件,但让应用程序运行(在我的情况下很难看到,因为它位于任务托盘中)。

我在installer.wxs文件中添加了以下代码:

<InstallExecuteSequence>
  <Custom Action="WixCloseApplications" Before="RemoveFiles" />
</InstallExecuteSequence>

<util:CloseApplication Id="CloseFoobar"
                       CloseMessage="no"
                       Description="FooBar is still running!"
                       ElevatedCloseMessage="no"
                       RebootPrompt="no"
                       Target="foobar.exe" />

但这不起作用 - 更糟糕的是,它会显示一个对话框,要求在安装期间重新启动!

这样做的正确方法是什么?

6 个答案:

答案 0 :(得分:7)

据我所知,将以下引用添加到您的UI中应该足够了:

<DialogRef Id="FilesInUse" />
<DialogRef Id="MsiRMFilesInUse" />

CloseApplication的东西只是用于在安装过程中关闭应用程序,但它是错误的(至少在几个月前我尝试过它,也许它现在已修复?)

不幸的是,这又是一个非常差的WiX文档的例子,甚至没有像这样的标准安装/卸载场景。

答案 1 :(得分:1)

几天前在wix-users邮件列表上提出了类似的问题。那里给出的答案是:

  

这是Windows的工作方式   Vista之前和重启管理器。那里   必须是一个顶级窗口   可用。托盘中的应用程序没有   计数。

wix-users archive中的主题也有几个主题。

答案 2 :(得分:1)

有关如何使用closeapplication的示例,请点击此链接: wix github project, unit tests

要显示提示对话框,您可以使用: <util:CloseApplication Id="CloseIE" Target="iexplore.exe" PromptToContinue="yes" Description="Test" />

答案 3 :(得分:0)

您是否可以检查卸载日志(here is how to enable them),据我所知,Windows Installer会将您的文件置于删除暂停状态,并要求在最后重新启动。
您还可以编写一个简单的自定义操作来终止您的进程。

答案 4 :(得分:0)

Shay的回答是正确的。最新版本的Windows Installer就是这样做的。 Windows Installer会遇到很多麻烦,以确保您可以通过重新映射使用中的Dll等来避免在卸载时重新启动。通常,正在运行的应用程序可以在卸载后继续运行,并且在应用程序时会进行一些清理在下次重启后关闭,其余的。重点是,如果Windows Installer可以将使用中的二进制文件移动到另一个位置,请保持所有应用程序正在运行,并替换正在使用的应用程序(但重新映射内存),并且所需要的只是删除一些非必要的垃圾在下次重启时为什么要强行重启?无需显示正在使用的文件对话框,因此不会出现这种情况。

如果应用尝试访问已卸载的文件,这可能会导致问题,但我认为风险很低。如果应用程序需要知道正在进行卸载,那么与Restart Manager集成应该可以正常工作--Windows会告诉它正在进行卸载。否则,Shay是正确的。如有必要,请编写卸载自定义操作以告知应用关闭。

答案 5 :(得分:0)

我也遇到了这个问题。 将Before属性更改为“InstallValidate”对我有用。

<Custom Before="InstallValidate" Action="WixCloseApplications"/>