MSI, как определить, работает ли Excel

Наше приложение - надстройка Excel. Мы используем Wix 3.10 для создания MSI. В настоящее время мы можем удалить приложение, даже если Excel работает с подключенной надстройкой. Мне нужно прервать процесс удаления, если Excel запущен. Нам не нужно закрывать Excel, мне просто нужно определить, работает ли он. Если это так, мне нужно показать пользователю соответствующее сообщение и остановить процесс удаления. Как определить, работает ли Excel (любое приложение) во время удаления? Могу ли я добиться желаемого поведения, используя «стандартные» возможности MSI / Wix, или я должен написать какое-то специальное действие?


person Alezis    schedule 24.06.2016    source источник


Ответы (2)


Вам понадобится настраиваемое действие, чтобы запросить Windows, запущен ли процесс Excel, и установить свойство с результатом. Затем вы можете использовать это в Launch Condition (элемент Condition), чтобы уведомить пользователя и заблокировать установку.

person Christopher Painter    schedule 26.06.2016
comment
Я пробовал этот подход, и он работает. Однако я не совсем понимаю, как выполнить эту проверку только при удалении. Я добавил условие REMOVE = ALL, но без какого-либо положительного результата, похоже, это свойство настроено после InstallValidate, то есть после LaunchCondition, поэтому Repair также запускает эту проверку Excel. Все равно над этим работаем. - person Alezis; 27.06.2016
comment
Запланируйте запуск настраиваемого действия перед поиском приложений и используйте или Установлено в вашем условии запуска, чтобы оно не было актуальным во время удаления. - person Christopher Painter; 27.06.2016

Наконец, я реализовал собственное действие. Это действие запускается в любом режиме установки: установка / удаление / восстановление и т. Д. Окно с сообщением о действии, которое просит пользователя закрыть 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;
}
person Alezis    schedule 06.07.2016