Цитата South:
не очень понятно где это можно применить на практике, если только рассматривать этот вопрос как чисто академический »
|
При запуске распаковки архивов.
Цитата South:
если вызвать ExecAndWait, то вызвавшая процедура/функция не завершится пока не завершится запущенное приложение.
а если после этого должны выполнится еще какие-то действия? »
|
Совершенно верно.
Видимо вы слабо знакомы с Inno Setup. Попробуйте запустить любую программу через Exec или ShellExec с параметром ожидания ewWaitUntilTerminated или запустить через [Run] и вы не сможите передвинуть окно инсталлятора.
Цитата South:
сдается мне, что _ProcIsRunning вообще не в кассу, постоянно шмонать список процессов далеко не лучшее решение. »
|

Понятно, вы знакомы с программированием...
Самый простой вариант, это открыть файл через OpenProcess, если Handle > 0, то процесс работает...
Ну вообще-то, вы наверно заметили, что я сначала сверяю ID процесса, а затем его имя, т.е. чтоб определить, что это именно тот файл.
Не знаю, знаете вы или нет, но ID процесса в системе не уникален. После завершения этого процесса, его ID освобождается и при запуске другого процесса ему может быть присвоен системой точно такой же ID.
Так что проверка просто по ID, я счёл не совсем правильным и точным.
Ну а более простой способ узнать имя процесса через его ID, мне к сожалению не известен. Если вам известен более простой способ, то поделитесь, так сказать для само развития.
Цитата South:
вообще для этих целей существует WaitForSingleObject »
|
Не согласен, инсталлятор, так же будет мёртвым, т.е. переместить вы его не сможете.
Цитата South:
данные о запущенных процессах я бы заносил в массив »
|
и что дальше? Процесс закрылся, а с таким же ID, работает уже другой...
Цитата South:
по уму процедуру ожидания надо делать в отдельном потоке. в инно с этим проблемы, поэтому я бы запустил таймер (не очень хорошо, но на безрыбье ...), »
|
Совершенно с вами согласен, но стандартный Inno не поддерживает, не только многопоточность, он также не знает, что такое таймер (этот недостаток исправлен в версии от Restools). Если конечно не использовать дополнительных библиотек, а именно эту цель я и приследывал при написании данного скрипта, чтоб можно было использовать его без ничего.
Цитата South:
и была бы отдельная процедура прибития процессов при выходе из инсталла: прибили таймер и опять же пробежались по массиву и всем процессам TerminateProcess »
|
и прибили другой процесс...
Цитата South:
тогда и _Application_ProcessMessages не нужен »
|
да, если была бы возможность всё делать в отдельном потоке.
Цитата South:
в цикле от "if _QUIT then Break; " не будет толку. если процесс первый в списке, то ты из цикла "while _ProcIsRunning(ProcessName, ProcessID) do;" не выйдешь. в этом же случае не сработает _Application_ProcessMessages »
|
Здесь я с вами полностью согласен, недоглядел...