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);

// чекаємо, поки завершиться консольний додаток