Добрый вечер всем моим подписчикам и читателям. Сегодня мы с вами продолжим увеличивать функциональность нашего инсталлятора и усложнять себе жизнь. Итак, начнём.
1. Обнаружение и остановка процессов и служб.
Когда может это потребоваться? Например, многие из вас пользуются Skype и регулярно обновляют его. При обновлении программа закрывается, а после установки она опять запускается. Как вы знаете, заменить файл без остановки его работы в ОС нельзя, для начала нужно завершить этот процесс. Сегодня мы это и будем делать. Но перед тем, чтобы что-то останавливать, нужно сначала что-то найти.
Запускаем наш проект Program, с которым мы и работаем всё это время или содаём новый. Заходим во вкладку "Настраиваемые действия" и ищем параметр Detect Process. Чуть ниже мы видим также Detect Service - с ним можно поступить аналогично, если хотите обнаружить службу. Щёлкаем пару раз по Detect Process и пишем там имя нашего процесса. В данном случае это будет Program.exe. Также запоминаем, что у нас появилось свойство AI_PROCESS_STATE, оно нам потребуется обязательно.
После этого давайте создадим окно, которое покажет нам при установке, что процесс выполняется и попросит разрешение его остановить. Это не обязательно делать, но всё же лучше уведомить пользователя об этом, а не закрывать процесс автоматически.(Кстати, упомянутый Skype делает это сам, без вопросов). Находим там-же параметр Display Message Box и парой щелчков мышью добавляем его туда-же. Пишем название окна и сообщение для пользователя. Выбираем, какие кнопки будут отображены в нашем окне (Я выбрал "Да" и "Нет"), а также вывод свойства (BTN_PRESSED) - оно нам потребуется далее. Внизу в условиях заполняем указанное выше условие AI_PROCESS_STATE= "Running".
Теперь нужно создать действие по остановке процесса. Выбираем Terminate Process. И добавляем его так же, как и два действия выше. В настройках действия пишем естественно Program.exe, а в условии прописываем BTN_PRESSED = "IDYES" ("IDYES" - это идентификатор кнопки "Да").
Теперь вы наверное поняли, что нам требуется правильно расположить наши добавленные действия. Как нам подсказывает логика:
1. Сначала мы определяем запущенный процесс.
2. Открываем окно с предупреждением о запущеном приложении и просим разрешить его остановку.
3. Останавливаем этот процесс.
4. Соответственно, всё это нужно сделать до установки файлов. Так что перетаскивает эти действия до выполнения собственно установки прораммы, в этап мастера:
Теперь мы можем собрать проект и проверить.
Запустим нашу программу после сборки и одновременно с ней попробуем её и установить.
Как видим, всё получилось как мы и хотели. С сервисами мы можем поступить почти аналогично.
Только параметр для окна запроса завершения у нас будет AI_SERVICE_STATE = "Started". Меняем также вывод свойства, например на BTN_PRESSED_1, так как обычный BTN_PRESSED у нас уже используется в установщике.
А условие для запуска остановки нужно будет изменить на BTN_PRESSED_1 = "IDYES" по аналогии.
Далее всё будет похоже. Так как у нас "не настоящая служба", а придуманная из другого исполняемого файла, то протестировать мы не может. Но всё должно работать. Если не будет - пишите, будем разбираться.
2. Отображение лога установки вашей программы.
Во вчерашней статье я упоминал, что в используемой нами теме "Весна" мы видим только шкалу прогресса установки программы, но не видим лог, то есть что и куда копируется. Давайте попробуем это исправить. Для этого заходим в "Диалоговые окна" и выбираем диалог прогресса установки (ProgressDlg). Удаляем всё лишнее, кроме собственно шкалы прогресса, а её убираем вверх или вниз. Некоторые свойства будут скрыты (как видно на скриншоте), так что щёлкайте по окну и ищите их, а после удаляйте (иначе они нам могут помешать).
Теперь добавим туда "Поле ввода".
Растянем поле, как нам нужно. В его свойствах включим режим только для чтения, вертикальную прокрутку и многострочный атрибут.
Теперь добавляем "Подписку на событие" для этого элемента. Отображение события выбираем "Отображение подробностей действия установки", а в атрибутах - "Текст".
Теперь заходим в настройки темы и проверяем, включен ли у нас "Расширенный пользовательский интерфейс".
Если всё ок, то выполняем сборку. После сборки запускаем установщик и проверяем.
Как видим, в окне у нас отображается лог прогресса установки. Также мы видим, что с файлами со вчерашнего урока, которые у нас загружаются с сервера и распаковываются, всё нормально. Весь прогресс в скриншот не поместился, но думаю что вам стало понятнее, как и что происходит.
На этом у меня на сегодня всё. Всем спасибо за внимание и поддержку. До завтра!
Привет!
Этот пост был выбран Академией Голоса и попал в список программы поддержки качественных образовательных постов.
Ссылка на твой пост будет опубликована в отчете Академии.
Спасибо за полезный контент (ノ◕ヮ◕)ノ*:・゚✧