Я разрабатываю инструмент автоматического обновления. Архитектура следующая: у меня есть приложение GUI и служба, которые обмениваются данными между ними; приложение gui устанавливается для запуска при каждом запуске операционной системы, и то же самое делается для службы.
Когда приложение GUI обнаруживает, что доступно новое обновление, оно загружает обновление и запрашивает service, чтобы запустить его в автоматическом режиме (я использовал службу для этой задачи, потому что установщик должен запускаться с правами администратора без вмешательства пользователя). На этом этапе установщик запускается (имейте в виду, что это дочерний элемент службы, поэтому он наследует контекст запуска службы) в автоматическом режиме (в качестве системы установки я использую nsis) и выполняет удаление текущего приложения (он удаляет приложение GUI и его двоичные файлы, останавливает службу / убивает службу и поэтому в основном оно убивает своего отца, удаляет службу из системы и удаляет ее двоичные файлы) и устанавливает новый пакет программного обеспечения, который включает новое приложение gui и новый сервис. Мне интересно, можно ли во время этого процесса удаления / установки избежать выключения системы (поскольку выключение во время этого процесса может привести к повреждению файлов приложения и состояния приложения).
Я читал о WM_QUERYENDSESSION и ShutdownBlockReasonCreate, но поскольку мой установщик работает как дочерний по отношению к службе, он запускается в сеансе 0, поэтому, как указано здесь https://devblogs.microsoft.com/oldnewthing/20151002-00/?p=91461, я не могу их использовать. Я также не могу использовать флаг SERVICE_ACCEPT_PRESHUTDOWN, потому что установщик обновляет службу (поэтому флаг не будет иметь никакого эффекта после удаления службы).
Не могли бы вы предложить решение проблемы, указанной выше? Я также готов пересмотреть свою программную архитектуру, если в текущей архитектуре нет других вариантов.
Спасибо