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

Previous  Top  Next

    
 

 

 

Code:

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 можно запустить только если запускать готовое приложение в терминале.

 

©Drkb::04625

Автор: Vit (www.delphist.com, www.drkb.ru, www.unihighlighter.com, www.nevzorov.org)