我们的应用程序是Excel加载项。我们使用Wix 3.10来构建MSI。目前我们可以执行卸载的应用程序,即使Excel运行连接加载项。 如果Excel正在运行,我需要中断卸载过程。我们不需要关闭Excel,我只需要检测它是否正在运行。如果是这样,我需要向用户显示适当的消息并停止卸载过程。如何检测卸载过程中运行的Excel(任何应用程序)? 我是否可以使用“标准”MSI/Wix功能实现所需的行为,还是应该编写一些自定义操作?MSI如何检测Excel是否运行
回答
如果excel进程正在运行并设置结果属性,则需要一个自定义操作来查询Windows。然后,您可以在Launch Condition(Condition元素)中使用它来通知用户并阻止安装。
我试过这种方法,它的工作原理。不过,我不太明白如何仅通过卸载运行此检查。我添加了条件REMOVE =“ALL”,但没有任何积极的结果,它看起来像这个属性在InstallValidate之后设置,即在LaunchCondition之后,因此Repair也会触发这个excel检查。无论如何,仍然在努力。 – Alezis
安排自定义操作在AppSearch之前运行,并在启动条件中使用“或已安装”,因此在卸载期间不相关。 –
最后我实现了我自己的自定义操作。此操作会触发任何安装模式:安装/卸载/修复等操作显示消息框,要求用户关闭Excel并具有两个按钮“重试”和“取消”。如果用户按'重试'代码重复检查是Excel运行,'取消'会导致另一个对话框,当用户被要求继续或真正取消。 有一个在C#行动(请注意,此代码是用维克斯SDK:Microsoft.Deployment.WindowsInstaller.dll
):
[CustomAction]
public static ActionResult IsExcelRunning(Session session)
{
session.Log("Begin IsExcelRunning.");
MessageResult msgBoxResult = MessageResult.Cancel;
do
{
session.Log("Try to find running Excel.");
bool isExcelRunning = false;
try
{
var obj = Marshal.GetActiveObject("Excel.Application");
isExcelRunning = null != obj;
session.Log("IsExcelRunning = " + isExcelRunning);
if (null != obj)
{
Marshal.FinalReleaseComObject(obj);
obj = null;
GC.Collect();
}
}
catch (Exception ex)
{
session.Log("Exception:" + ex);
}
if (!isExcelRunning)
{
session.Log("End IsExcelRunning.");
return ActionResult.Success;
}
else
{
var errorRecord = new Record(1);
errorRecord.SetInteger(1, 30000);
try
{
msgBoxResult =
session.Message(InstallMessage.Error | (InstallMessage) MessageButtons.RetryCancel,
errorRecord);
}
catch (InstallCanceledException)
{
var questionRecord = new Record(1);
questionRecord.SetInteger(1, 1602);
if (MessageResult.Yes ==
session.Message(
InstallMessage.Error | (InstallMessage)MessageButtons.YesNo |
(InstallMessage)MessageBoxIcon.Question, questionRecord))
{
session.Log("End SetIsExcelRunning.");
return ActionResult.UserExit;
}
else
{
msgBoxResult = MessageResult.Retry;
}
}
catch (Exception ex)
{
session.Log("Unexpected exception:" + ex);
throw;
}
}
} while (MessageResult.Retry == msgBoxResult);
session.Log("End IsExcelRunning.");
return ActionResult.UserExit;
}
- 1. 如何检测是否运行ipython qtconsole?
- 2. 检测是否需要MSI安装
- 3. 检测是否Qt是在运行时
- 4. 如何检测我的Wix MSI中运行的软件?
- 5. 如何检测正在运行的MSI安装
- 6. 如何检测是否红宝石运行黄瓜测试
- 7. Android:如何检测用户是否运行6.0.1,而不是6.0
- 8. 检测Windows是否在Parallels中运行?
- 9. 检测是否在launchd下运行
- 10. 检测我是否在SharePoint中运行
- 11. 检测MediaBrowserServiceCompat是否正在运行
- 12. 检测Windows是否“完全运行”
- 13. 检测CountdownTimer是否正在运行
- 14. javascript检测是否在hta中运行
- 15. 检测jQuery是否正在运行
- 16. Wix-Msi:如何检查msi数据表中是否存在特定行
- 17. 如何在运行时检测.NET中是否存在类?
- 18. 如何检测它是否在iPhone或iPad上运行?
- 19. 如何检测我是否在芹菜工人身上运行?
- 20. 如何检测远程计算机是否正在运行RDP?
- 21. Heroku:如何检测工头是否正在运行
- 22. 如何检测特定的Delphi IDE是否正在运行?
- 23. OSX:如何检测Mission Control是否正在运行?
- 24. 如何检测应用程序是否从DVD运行?
- 25. C#:如何检测屏幕阅读器是否正在运行?
- 26. 如何检测延迟作业是否正在运行?
- 27. 厨师如何检测厨师是否在Mac上运行?
- 28. 如何检测应用程序是否正在运行Cloud9?
- 29. Ajax长轮询如何检测它是否正在运行
- 30. 如何检测PIX是否正在运行?
CloseApplication? http://wixtoolset.org/documentation/manual/v3/xsd/util/closeapplication.html –
换句话说,您正在绕开Windows Installer让您卸载并保持Excel运行的事实? Windows会跳过这些环节,让它在没有重新启动的情况下发生,并在Excel完成后稍后进行清理。如果用户和Excel很乐意在没有问题的情况下继续运行,则在防止卸载方面没有任何价值。 – PhilDW
如果没有问题,可能会出现这种情况,但是我们遇到了一些麻烦:卸载不能删除某些文件并保留一些文件夹,因为excel在运行时保留这些文件在使用中。显然这是不希望的行为。我应该解决这个问题。 – Alezis