16.38.2. function ExecuteFileOUT
function ExecuteFileOUT(FileName, Params: string;
Mode : integer;
WaitTime : integer; ATerminate : boolean;
AOUT: TStringList; AErrors : TStringList;
ACodePage : integer) : boolean;
Производит выполнение указанного приложения, полный аналог ExecuteFile, за исключением того, что данная функция предназначена для запуска консольных приложений и перехватывает выводимые ими на консоль данные с учетом кодировки. Код возврата процесса, запущенного при помощи ExecuteFileOUT можно узнать при помощи функции GetLastExitCode
Функция возвращает true в случае успешного запуска процесса, false в случае ошибки.
AOUT - экземпляр класса TStringList, в случае успешного запуска приложения заполняется строками, выведенными запущенным приложением на консоль в поток StdOutput. Если поток StdOutput не представляет интереса, вместо экземпляра класса можно передать nil.
AErrors - экземпляр класса TStringList, в случае успешного запуска заполняется строками, выведенными запущенным приложением на консоль в поток StdError. Если поток StdError не представляет интереса, вместо экземпляра класса можно передать nil.
ACodePage - кодовая страница для перекодировки сообщений, выводимых приложением в консоль. Для русскоязычной Windows это, как правило, 866.
Совместимость: AVZ 5.45 и выше
Начиная с версии AVZ 5.62 при помощи функции GetLastError можно проверить успешность выполнения данной операции и получить код ошибки.
На заметку:
Так как в данном случае необходимо дождаться завершения работы приложения, WaitTime=0 не поддерживается, для значений менее 5000 оно автоматически исправляется на 5000 (т.е. минимальное ожидание завершения процесса - 5 секунд, рекомендуется задать большие значения, так как если приложение завершится раньше заданного интервала, то ожидание немедленно прервется).
Пример:
var
PrgOut, PrgErr : TStringList;
begin
PrgOut := TStringList.Create;
PrgErr := TStringList.Create;
ExecuteFileOUT('cmd', '/c dir', 1, 15000, true, PrgOut, PrgErr, 866);
AddToLog('Приложение вывело на консоль:');
AddToLog(PrgOut.text);
AddToLog('Ошибки:');
AddToLog(PrgErr.text);
end.
В данном примере выполняется команда DIR, и результаты работы этой команды выводится в протокол.
var
PrgOut, SummaryOut: TStringList;
procedure AddLinesToSummary(ALines : TStringList);
var
i : integer;
begin
for i := 0 to ALines.Count-1 do
SummaryOut.Add(ALines[i]);
end;
begin
PrgOut := TStringList.Create;
SummaryOut:= TStringList.Create;
SummaryOut.Add('--- Запуск ipconfig /flushdns ---');
ExecuteFileOUT('ipconfig', '/flushdns', 1, 15000, true, PrgOut, nil, 866);
SummaryOut.Add(PrgOut.Text);
SummaryOut.Add('--- Запуск ipconfig /all ---');
ExecuteFileOUT('ipconfig.exe', '/all', 1, 15000, true, PrgOut, nil, 866);
SummaryOut.Add(PrgOut.Text);
AddToLog('Итоговый протокол:');
AddToLog(SummaryOut.text);
end.
В данном примере демонстрируется формирование сводного протокола, содержащего данные, выведенные в StdOut несколькими консольными приложениями.