Sources
Delphi Russian Knowledge Base
DRKB - база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как запустить консольное приложение и перехватить вывод?

01.01.2007
Vit

procedure ExecCmdine(const CmdLine: string; CmdResult: TStrings);
var
  Output: PIOFile;
  Buffer: PChar;
  TempString: string;
  Line: string;
  BytesRead: Integer;

const
  BufferSize: Integer = 1000;

begin
  Output := popen(PChar(CmdLine), 'r');
  GetMem(Buffer, BufferSize);
  if Assigned(Output) then
  try
    while feof(Output) = 0 do
    begin
      BytesRead := Libc.fread(Buffer, 1, BufferSize, Output);
      SetLength(TempString, Length(TempString)+BytesRead);
      memcpy(@TempString[length(TempString)-(BytesRead-1)], Buffer, BytesRead);
      while Pos(#10, TempString) > 0 do
      begin
        Line := Copy(TempString, 1, Pos(#10, TempString)-1);
        if CmdResult<>nil then CmdResult.Add(Line);
        TempString := copy(TempString, Pos(#10, TempString)+1, Length(TempString));
      end;
    end;
  finally
    Libc.pclose(output);
    wait(nil);
    FreeMem(Buffer,BufferSize);
  end;
end;

Примечание

Под отладчиком Kylix код может не работать. Надо запускать приложение не под Kylix для того чтобы удостовериться что код работает. Кроме того некоторые консольные приложения, типа top не совсем стандартно используют консоль, поэтому я наблюдал такое явление, что top можно запустить только если запускать готовое приложение в терминале.

Previous page:
Как отловить CLX форму?
Top:
DRKB
Next page:
Как клонировать процесс?