(отредактировано в ответ на комментарии ниже.)
Для этого есть пара шагов: во-первых, на самом деле запустить скрипт; во-вторых, проверьте, успешно ли он запустился (как ему удалось запустить новый процесс, так и успешно ли этот процесс).
Часть 1, запуск сценария:
Чтобы запустить скрипт из приложения Delphi, используйте ShellExecuteEx
с глаголом "open
", который должен работать (подробнее см. Флаги ниже.) Вы можете выполнить сам скрипт, если он связан с исполняемый файл Perl или запустите исполняемый файл Perl со сценарием в качестве аргумента командной строки.
Эта статья выглядит хорошей отправной точкой для использования этого API и его более простого двоюродного брата ShellExecute
.
Функции ShellExecute[Ex]
обычно ожидают, что ваше приложение впоследствии запустит цикл обработки сообщений. Маловероятно, что ваше приложение не так, до тех пор, пока пользователь нажимает кнопку, чтобы запустить это приложение, оно бездействует, но если по какой-то причине это не происходит, вы должны пройти флаг SEE_MASK_NOASYNC
. MSDN имеет много информации.
Часть 2, проверка, успешно ли он выполнен и успешно справился со своей задачей:
Чтобы увидеть, выполнен ли скрипт, вы должны получить дескриптор процесса для запущенного процесса и, если был новый процесс, проверить код выхода из этого. Вы должны изменить свой скрипт, чтобы он возвращал ненулевой код, если его задача не выполнена. (Я не знаком с Perl, поэтому не могу сказать, как именно, но обычно это возвращаемое значение из функции "main" или другой функции first / startup.) Вы можете сделать это с помощью:
- Передайте флаг
SEE_MASK_NOCLOSEPROCESS
в ShellExecuteEx
. Это заполнит hProcess
член структуры, которую вы передаете, дескриптором процесса, если он успешно запустил процесс (если нет, проверьте GetLastError
, чтобы выяснить, почему.) Если это все, что вам нужно знать (только если все началось, ничего, если это сработало) то все готово.
- Необязательно: дождитесь завершения процесса, используя
WaitForSingleObject(YourParamStruct.hProcess, INFINITE)
(если, конечно, вы получили действительный hProcess)
- Позвоните
GetExitCodeProcess
, чтобы найти код выхода. (Проверьте, что он возвращает STILL_ACTIVE
, и, если он все еще работает, подождите и повторите попытку.) Как правило, он должен завершиться с 0
, чтобы указать успех. Вы должны изменить ваш скрипт так, чтобы если что-то пошло не так, он возвращал ненулевое значение. Вы можете сделать коды такими же простыми или сложными, как хотите - например, вернуть 1
для любой ошибки или сделать несколько кодов, разбитых по типу ошибки. (Избегайте использования 259
, потому что это значение STILL_ACTIVE
- это может привести ваш Delphi-код в бесконечный цикл, в зависимости от того, как он закодирован, думая, что он все еще ожидает получения кода выхода, потому что сценарий Perl все еще выполняется, когда это не так.)
Ваше приложение Delphi может затем проверить этот код, чтобы увидеть, работает ли Perl-скрипт или нет, и сделать что-то в ответ в случае неудачи - зарегистрировать сообщение, сообщить пользователю и т. Д.
Еще одна вещь - вы говорите, что просто хотите знать, выполняется сценарий или нет, и вышеприведенное должно это обеспечить. Учитывая, что это сценарий Perl и выполняется в командной строке, вам может потребоваться еще одна вещь - получить его выходные данные, либо сканировать на наличие ошибок, если вы не возвращаете код ошибки, либо регистрировать или показывать пользователю. Вы можете сделать это, запустив его через CreateProcess
и , захватив выходные данные . Из того, что вы говорите, это, вероятно, излишне для того, что вы после этого!