Программирование: ExecAndLogOutput

Прототип

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;

См. также:

Exec
ExecAndCaptureOutput