2016-06-24 90 views
0

我们的应用程序是Excel加载项。我们使用Wix 3.10来构建MSI。目前我们可以执行卸载的应用程序,即使Excel运行连接加载项。 如果Excel正在运行,我需要中断卸载过程。我们不需要关闭Excel,我只需要检测它是否正在运行。如果是这样,我需要向用户显示适当的消息并停止卸载过程。如何检测卸载过程中运行的Excel(任何应用程序)? 我是否可以使用“标准”MSI/Wix功能实现所需的行为,还是应该编写一些自定义操作?MSI如何检测Excel是否运行

+0

CloseApplication? http://wixtoolset.org/documentation/manual/v3/xsd/util/closeapplication.html –

+0

换句话说,您正在绕开Windows Installer让您卸载并保持Excel运行的事实? Windows会跳过这些环节,让它在没有重新启动的情况下发生,并在Excel完成后稍后进行清理。如果用户和Excel很乐意在没有问题的情况下继续运行,则在防止卸载方面没有任何价值。 – PhilDW

+0

如果没有问题,可能会出现这种情况,但是我们遇到了一些麻烦:卸载不能删除某些文件并保留一些文件夹,因为excel在运行时保留这些文件在使用中。显然这是不希望的行为。我应该解决这个问题。 – Alezis

回答

3

如果excel进程正在运行并设置结果属性,则需要一个自定义操作来查询Windows。然后,您可以在Launch Condition(Condition元素)中使用它来通知用户并阻止安装。

+0

我试过这种方法,它的工作原理。不过,我不太明白如何仅通过卸载运行此检查。我添加了条件REMOVE =“ALL”,但没有任何积极的结果,它看起来像这个属性在InstallValidate之后设置,即在LaunchCondition之后,因此Repair也会触发这个excel检查。无论如何,仍然在努力。 – Alezis

+0

安排自定义操作在AppSearch之前运行,并在启动条件中使用“或已安装”,因此在卸载期间不相关。 –

0

最后我实现了我自己的自定义操作。此操作会触发任何安装模式:安装/卸载/修复等操作显示消息框,要求用户关闭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; 
}