Наше приложение - надстройка Excel. Мы используем Wix 3.10 для создания MSI. В настоящее время мы можем удалить приложение, даже если Excel работает с подключенной надстройкой. Мне нужно прервать процесс удаления, если Excel запущен. Нам не нужно закрывать Excel, мне просто нужно определить, работает ли он. Если это так, мне нужно показать пользователю соответствующее сообщение и остановить процесс удаления. Как определить, работает ли Excel (любое приложение) во время удаления? Могу ли я добиться желаемого поведения, используя «стандартные» возможности MSI / Wix, или я должен написать какое-то специальное действие?
MSI, как определить, работает ли Excel
Ответы (2)
Вам понадобится настраиваемое действие, чтобы запросить Windows, запущен ли процесс Excel, и установить свойство с результатом. Затем вы можете использовать это в Launch Condition (элемент Condition), чтобы уведомить пользователя и заблокировать установку.
Наконец, я реализовал собственное действие. Это действие запускается в любом режиме установки: установка / удаление / восстановление и т. Д. Окно с сообщением о действии, которое просит пользователя закрыть Excel и имеет две кнопки «Повторить» и «Отменить». Если пользователь нажимает код «Повторить», повторная проверка выполняется в Excel, «Отмена» приводит к другому диалоговому окну, когда пользователя просят продолжить или действительно отменить. В C # есть действие (обратите внимание, что этот код используется Wix 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;
}