Как запустить консольное приложение и перехватить вывод?
Falk0ner, вс, 06/07/2008 - 15:35.
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;
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 можно запустить только если запускать готовое приложение в терминале.
Автор: Vit (www.delphist.com, www.drkb.ru, www.unihighlighter.com, www.nevzorov.org)
Отправить комментарий