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

Прототип

function ExecAndCaptureOutput(const Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ResultCode: Integer; var Output: TExecOutput): Boolean;

Описание

Идентична функции Exec за исключением:

  — вывод программы перехватывается из потоков stdout и stderr. Это отличается от функции ExecAndLogOutput, которая объединяется потоки вывода.

  — консольные программы всегда запускаются в скрытом режиме, а параметр ShowCmd влияет только на программы с графического интерфейсом, поэтому рекомендуется всегда использовать флаг SW_SHOWNORMAL вместо SW_HIDE;

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

Комментарии

При вызове этой функции для параметра Wait всегда должно быть установлено значение ewWaitUntilTerminated.

Класс TExecOutput объявлен как:

TExecOutput = record
  StdOut: TArrayOfString;
  StdErr: TArrayOfString;
  Error: Boolean;
end;

Error будет True, если чтение вывода не удалось (что возможно в довольно редких случаях), или если вывод слишком велик. Ошибка регистрируется в файле журнала установки или удаления и/или в панели сообщений отладки IDE компилятора. После ошибки дальнейший вывод не производится.

Общий размер вывода ограничен 10 миллионами байт или максимум 1 миллионом строк.

Пример

var
  ResultCode: Integer;
  Output: TExecOutput;
begin
  try
    // Получаем конфигурацию системы
    Result := ExecAndCaptureOutput(ExpandConstant('{cmd}'), '/c systeminfo', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode, Output);   
  except
    Result := False;
    Log(GetExceptionMessage);
  end;

  if Result then begin
    // Выполняем необходимые операции с массивом строк Output.StdOut
  end;
end;

См. также:

Exec
ExecAndLogOutput