function ExecAndLogOutput(const Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ResultCode: Integer; const OnLog: TOnLog): Boolean;
Идентична функции Exec за исключением:
— консольные программы всегда
запускаются в скрытом режиме, а параметр ShowCmd влияет только
на программы с графического интерфейсом, поэтому рекомендуется всегда
использовать флаг SW_SHOWNORMAL
вместо SW_HIDE
;
— если значение параметра OnLog равно nil, то выходные данные исполняемого или пакетного файла регистрируются в файле журнала программы установки/удаления и/или в сообщениях отладки IDE компилятора;
— если значение параметра OnLog не равно nil, то выходные данные передаются в указанную функцию построчно.
При вызове этой функции для параметра Wait всегда должно быть установлено значение ewWaitUntilTerminated.
Класс TOnLog
объявлен как:
TOnLog = procedure(const S: String; const Error, FirstLine: Boolean);
Параметр S – это строка вывода, если значение Error равно False, в противном случае – сообщение об ошибке. FirstLine равно True, если это первая строка вывода программы, иначе – False.
Error будет True, если чтение вывода не удалось (что возможно в довольно редких случаях), или если вывод слишком велик. После ошибки дальнейший вывод не производится.
Общий размер вывода ограничен 10 миллионами байт или максимум 1 миллионом строк.
var Line: String; procedure ExecAndGetFirstLineLog(const S: String; const Error, FirstLine: Boolean); begin if not Error and (Line = '') and (Trim(S) <> '') then Line := S; { Найдена первая непустая строка; сохраняем её } if FirstLine then Log('Output:'); Log(S); end; function ExecAndGetFirstLine(const Filename, Params, WorkingDir: String; var ResultCode: Integer): String; begin Line := ''; ExecAndLogOutput(Filename, Params, WorkingDir, SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode, @ExecAndGetFirstLineLog); Result := Line; end;