Как запустить консольное приложение и перехватить вывод? |
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)