Если вы хотите создать надлежащую программу установки/обновления, не беспокойтесь о том, когда и как ее выполнить, а вместо этого, как она обнаружит, работает ли ваше приложение или нет.
Теперь, если ваше основное приложение уже имеет механизм, чтобы предотвратить запуск нескольких экземпляров вашего приложения, у вас уже есть половина выполненной работы. Как?
Такие механики публикуют информацию о том, что экземпляр вашего приложения уже запущен, чтобы быть доступным другими программами.
Самая распространенная оценка для этого - зарегистрировать названный Mutex. Поэтому, когда запускается второй экземпляр вашего приложения, он обнаруживает, что он не может создать новый Mutex с тем же именем, поскольку он уже существует. Так что теперь в большинстве случаев второй экземпляр вашего приложения отправляет пользовательскому сообщению в первый экземпляр, чтобы перенести этот экземпляр на передний план (восстановить приложение), а затем закрывается.
Если вы хотите узнать больше о различных mechanizms, чтобы приободрить сколько экземпляров приложения могут быть запущены в то же время я предлагаю вам проверить следующую статью: http://delphi.about.com/od/windowsshellapi/l/aa100703a.htm
Так как же вы используете такой Механизм для инсталлятора/обновления?
Как и во втором экземпляре вашего приложения, чтобы проверить, не запущен ли еще один экземпляр, вместо этого вы проверяете это в своем установщике/обновлении. Вам даже не нужно делать эту проверку в начале программы установки/обновления. Вы можете сделать это еще позже (сначала загрузите файлы обновлений).
Если у вас есть экземпляр вашего приложения, вы передаете собственное сообщение. Но это сообщение отличается от того, которое один экземпляр отправит другому.
Теперь мы сообщим вашему приложению, что он будет обновлен, поэтому он должен начать процедуру закрытия.
Если вы формируете это настраиваемое сообщение таким образом, чтобы оно также содержало информацию о вашем приложении installer/updater application.handle, вы предоставляете себе возможность для вашего основного приложения отправлять ответ возврата, в котором он уведомляет установщик/обновление, в каком состоянии это.Для instnace:
- asClosing (Основное применение только к закрытию)
- asWaitinUserInput (основное приложение ждет пользователя, чтобы подтвердить, сохранить, например)
- asProcessing (основное применение делает некоторые длительные обработки, так это в этот момент не может быть выключен)
И если в течение определенного времени ваш установщик не отвечает, ваш основной приложение может быть повесить, чтобы он уведомлял пользователя о невозможности автоматического закрытия основного приложения и поэтому использование r должен закрыть его вручную, а затем повторить процесс обновления.
Использование такого подхода позволит вам в любое время запустить ваш установщик/обновление в процессе выполнения основного приложения.
И не только это. Вы можете запустить программу установки/обновления, дважды щелкнув ее исполняемый файл, с помощью shourtcut, с помощью какого-либо другого приложения или даже с помощью системы задач Windows.
.. при условии, что установщик может быть изменен ... или имеет такую функциональность встроенного. –
@SertacAkyuz Да, как мне грустно в первом ответе моего ответа, это полезно, если OP делает свою собственную программу прошивки для установщика/обновления для своего приложения. Но если OP ограничен с помощью стороннего установщика, он все равно может использовать это как механизм управления, который затем выполнит внешний установщик, когда основное приложение будет закрыто. – SilverWarior
Спасибо! Только небольшая заметка. Я уже использую мьютекс в A1, а также в A2. Установка создана в InnoSetup и поддерживает мьютекс и работает правильно. Поэтому мой вопрос был более распространенным. –