Как вы заставляете Inno Setup не выглядеть застывшей во время исполнения длинного Exec? - PullRequest
6 голосов
/ 26 февраля 2009

Длинный Exec устанавливает .NET 3.5, и сценарий out основан на этом: http://www.blackhillsoftware.com/blog/2006/06/26/using-innosetup-with-the-dotnet-framework/

Проблема в том, что он использует «ewWaitUntilTeridity», потому что нам нужно захватить код выхода. Это немного усугубляется тем фактом, что мы запускаем его / passive / norestart, так что это требует меньше усилий со стороны пользователя (может, не стоит?)

Самый простой вариант, о котором я могу подумать, - это скрыть окно во время установки .NET и снова показать его после завершения, но я не уверен, как это сделать.

Идеальным решением было бы показать страницу прогресса, но не похоже, чтобы это было возможно, так как нам нужно было бы вернуться сразу, но каким-то образом все еще получать уведомление о выходе из процесса и в противном случае захватывать код выхода у нас просто был бы вечный индикатор выполнения.

Есть идеи, как это сделать?

Edit: минимизация, вероятно, будет лучше, но не уверен, как это сделать. Мы отображаем сообщение, информирующее пользователя о том, что процесс может занять 10-20 минут, однако проблема в том, что основная форма настройки полностью заморожена, не может перемещаться, минимизировать или что-либо делать с ней. Кроме того, запуск / пассивная установка .NET фактически не показывает никакого прогресса в течение хороших минут или двух на более медленной машине.

Ответы [ 5 ]

7 голосов
/ 17 октября 2015

Один из способов заставить Innosetup «не выглядеть замороженным» - добавить «фальшивый» индикатор прогресса, например, выделение, чтобы показать, что что-то происходит. Но это не решит проблему «окно не перетаскивается / перемещается».

Итак, еще один способ - разморозить графический интерфейс Innosetup, пока выполняется длительный процесс:

«Длительный процесс» выполняется через ShellExecuteEx (). Затем установщик использует цикл while с условием WaitForSingleObject и очень минимальное время ожидания выполнить AppProcessMessage.

AppProcessMessage сама по себе является вспомогательной функцией. Он использует «общий» код для воссоздания процедуры «Application.ProcessMessages» -ish, используя функции WinAPI PeekMessage(), TranslateMessage() и DispatchMessage(). Его работа заключается в том, чтобы доставлять сообщения в графический интерфейс InnoSetup.

Этот трюк делает окно отзывчивым / перетаскиваемым снова, в то время как "длительный процесс" обрабатывается в фоновом режиме.

Это источник для цикла выполнения:

  if ShellExecuteEx(ExecInfo) then
  begin
    while WaitForSingleObject(ExecInfo.hProcess, 100) = WAIT_TIMEOUT
    do begin
        AppProcessMessage;
        WizardForm.Refresh();
    end;
  CloseHandle(ExecInfo.hProcess);
  end;

Следующая GIST для unzip.iss содержит код для автономного Unzip Helper для выполнения 7zip без блокировки InnoSetup GUI , включая биты и кусочки для работы с AppProcessMessage функцией.

В этом случае «unzip» - это просто пример, и вы можете заменить исполняемое приложение на что угодно, установщик .Net или любую другую долгосрочную задачу.

2 голосов
/ 26 февраля 2009

Вы можете просто скрыть форму мастера установки, вызвав

WizardForm.Hide;
Exec(...);
WizardForm.Show;

хотя я согласен, что это не очень красиво.

2 голосов
/ 26 февраля 2009

Хотя это, вероятно, будет легко, я не рекомендую прятать ваш установщик, пока работает установщик .Net. Я видел, как это делают другие установщики, и когда это происходит, я думаю, что установка завершена, и затем я растерялся, когда обнаружил, что это действительно не так. (И когда установка действительно закончится, я тоже не могу быть в этом уверен. Может, она просто снова спряталась.)

Вы можете отобразить пользовательские страницы в мастере настройки Inno. Создание такой страницы, показывающей индикатор выполнения и поддержание ее точности, вероятно, было бы проблемой, но по крайней мере вы могли бы отобразить на странице мастера сообщение о том, что ваш установщик ждет установщика .Net перед продолжением. См. Раздел «Использование пользовательских страниц мастера» файла справки.

0 голосов
/ 27 апреля 2014

Прошло 5 лет с тех пор, как вы задали вопрос, но в любом случае вот мой ответ.

Перед вызовом Exec () вы можете установить сообщение, которое будет отображаться Inno Setup над главной строкой прогресса, следующим образом:

WizardForm.StatusLabel.Caption := 'Installing .NET Framework 3.5. Please wait, this can take up to 1 hour...';
0 голосов
/ 26 февраля 2009

Нам нужно было установить .NET с парой продуктов, и мы выбрали два подхода:

  • При установке .NET с Innosetup мы сообщаем пользователю, что установка займет много времени, и ожидаем определенного сообщения после его завершения
  • Мы запускаем установку .NET без каких-либо флагов, чтобы заставить клиента пройти через нее. Таким образом, если они более технически склонны, они знают, почему установка занимает так много времени

Нам, честно говоря, повезло больше со вторым вариантом, особенно теперь, когда все больше системных администраторов, похоже, в определенной степени блокируют рабочие столы.

...