KVRSOFT - Як захопити весь висновок у консолі
Controls, Windows, SysUtils, Forms;
функція GetDosOutput (const CommandLine: string): string;
функція GetDosOutput (const CommandLine: string): string;
StdOutPipeRead, StdOutPipeWrite: THandle;
Buffer: array[0..255] of Char;
WorkDir, Line: string;
nLength:= SizeOf (SA);
// створимо пайп для перенаправлення стандартного виведення
CreatePipe (StdOutPipeRead, // дескриптор читання
StdOutPipeWrite, // дескриптор запису
@SA, // атрибути безпеки
0 // кількість байт прийнятих для пайпа - 0 за замовчуванням
// Створимо дочірній процес, використовуючи StdOutPipeWrite як стандартний висновок,
// А також перевіряємо, щоб він не показувався на екрані.
FillChar (SI, SizeOf (SI), 0);
dwFlags:= STARTF_USESHOWWINDOW або STARTF_USESTDHANDLES;
hStdInput:= GetStdHandle (STD_INPUT_HANDLE); // стандартне введення не перенаправляємо
// Запускаємо компілятор із командного рядка
WorkDir: = ExtractFilePath (CommandLine);
WasOK:= CreateProcess (nil, PChar (CommandLine), nil, nil, True, 0, nil, PChar (WorkDir), SI, PI);
// Тепер, коли отриманий дескриптор, для безпеки закриваємо запис.
// Нам не потрібно, щоб сталося випадкове читання чи запис.
// Якщо процес може бути створений, то дескриптор, це його висновок
if not WasOK then
raise Exception.Create ('Could not execute command line!')
// отримуємо весь висновок доти, доки DOS-додаток не буде завершено
// читаємо блок символів (можуть містити повернення каретки та переклади рядка)
WasOK: = ReadFile (StdOutPipeRead, Buffer, 255, BytesRead, nil);
// Чи є щось ще? для читання?
if BytesRead > 0 then
// завершуємо буфер PChar-ом
// додаємо буфер у загальний висновок
Line:= Line Buffer;
until not WasOK or (BytesRead = 0);
// чекаємо, поки завершиться консольний додаток