2010-06-04 108 views
1

我正试图在使用Wix进行卸载之前关闭一个进程。我已经证实,只要有一个可见的窗口,它就会工作,但如果没有可见的窗口(这是大多数情况下这个应用程序,因为它是一个系统托盘应用程序),卸载程序只是挂起,最终会继续卸载,从而使进程继续运行。Wix's util:CloseApplication扩展似乎不起作用

根据this forum post,Wix似乎在过去关闭最小化的应用程序时遇到了困难,所以我想知道这是否相关?

对于我能做些什么来确保进程关闭有任何建议?有什么办法可以尝试使用Win32 api在我的应用程序中捕获消息?

这里的CloseApplication声明:

<util:CloseApplication Id="CloseApp" CloseMessage="yes" Target="App.exe" RebootPrompt="yes" /> 

而这里的自定义操作:

<Custom Before="InstallInitialize" Action="WixCloseApplications">REMOVE = "ALL"</Custom> 

回答

4

看起来你正在计划安装交易之前WixCloseApplications自定义操作。自定义操作的工作方式是计划一个实际关闭应用程序的延迟操作。除非在交易过程中发生(After="InstallInitialize"),否则无法完成此项工作。

该修复可能很容易。删除Custom/@Action="WixCloseApplications"元素。

2

起初,请不要忘记引用WixUtilExtension.dll程序集。 同时检查维克斯元素包含UtilExtension命名空间的定义:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"> 

我注意到,你应该改变你的自定义操作InstallInitialize之前执行。

<Custom Before="InstallInitialize" Action="WixCloseApplications">REMOVE = "ALL"</Custom> 

如果应用这些变化和CloseApplications扩展不起作用,尝试登录使用

msiexec /i MyApplication.msi /l*v MyLogFile.txt 
0

我也面临这个问题的安装过程。 将Before属性更改为“InstallValidate”为我工作。

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