Как мне прочитать вывод консольных приложений во время его работы. Я запускаю консольное приложение и хочу прочитать вывод, напечатанный консольным приложением.
Delphi 6 - чтение вывода консольного приложения во время работы
Ответы (3)
А как насчет этого решения?
РЕДАКТИРОВАТЬ: ссылка ведет к этому решению (слегка отредактировано для удобочитаемости и удаления использования with
):
// The example runs 'chkdsk.exe c:\' and displays the output to Memo1.
// Put a TMemo (Memo1) and a TButton (Button1) on your form. Put this
// code in the OnCLick event procedure for Button1:
procedure TForm1.RunDosInMemo(DosApp:String;AMemo:TMemo) ;
const
ReadBuffer = 2400;
var
Security : TSecurityAttributes;
ReadPipe,
WritePipe : THandle;
start : TStartUpInfo;
ProcessInfo : TProcessInformation;
Buffer : Pchar;
BytesRead : DWord;
Apprunning : DWord;
begin
Security.nlength := SizeOf(TSecurityAttributes) ;
Security.binherithandle := true;
Security.lpsecuritydescriptor := nil;
if Createpipe (ReadPipe, WritePipe, @Security, 0) then
begin
Buffer := AllocMem(ReadBuffer + 1) ;
FillChar(Start,Sizeof(Start),#0) ;
start.cb := SizeOf(start) ;
start.hStdOutput := WritePipe;
start.hStdInput := ReadPipe;
start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
start.wShowWindow := SW_HIDE;
if CreateProcess(nil,
PChar(DosApp),
@Security,
@Security,
true,
NORMAL_PRIORITY_CLASS,
nil,
nil,
start,
ProcessInfo) then
begin
repeat
Apprunning := WaitForSingleObject(ProcessInfo.hProcess,100);
Application.ProcessMessages;
until (Apprunning <> WAIT_TIMEOUT) ;
repeat
BytesRead := 0;
ReadFile(ReadPipe,Buffer[0],
ReadBuffer,BytesRead,nil) ;
Buffer[BytesRead]:= #0;
OemToAnsi(Buffer,Buffer) ;
AMemo.Text := AMemo.text + String(Buffer) ;
until (BytesRead < ReadBuffer) ;
end;
FreeMem(Buffer) ;
CloseHandle(ProcessInfo.hProcess) ;
CloseHandle(ProcessInfo.hThread) ;
CloseHandle(ReadPipe) ;
CloseHandle(WritePipe) ;
end;
end;
procedure TForm1.Button1Click(Sender: TObject) ;
begin
RunDosInMemo('chkdsk.exe c:\', Memo1) ;
end;
person
ErvinS
schedule
31.07.2009
хорошее предложение для тех, кто переходит по ссылке, но сама по себе ссылка не совсем хороший ответ, см .: meta.stackexchange.com/questions/8231/
- person Argalatyr; 31.07.2009
@Mick: упс - пока вы это делали в новом ответе, я редактировал старый. Если кто-то считает, что мою правку нужно откатить, смело делайте это.
- person Argalatyr; 31.07.2009
Не беспокойся. Тогда я удалил свой комментарий.
- person Mick; 31.07.2009
Это не считывает вывод по мере его поступления, он только читает все в самом конце ... это не то, что я ищу.
- person ; 03.08.2009
Жаль, что это не совсем то, что вы ищете, но этот код - то, что я искал, тем не менее, спасибо.
- person Robo; 25.03.2010
Обычно я использую этот перенесенный код FPC: http://www.stack.nl/~marcov/processdelphi.zip
Он содержит класс для управления внешними программами (это класс, используемый Lazarus для вызова компилятора cmdline и других программ).
Документация здесь, но порт delphi немного устарел, поэтому не все задокументированные свойства могут существовать в указанной выше версии.
http://www.freepascal.org/docs-html/fcl/process/index.html
person
Marco van de Voort
schedule
02.08.2009
В последних версиях FPC несколько простых процедур, которые исправляют некоторые из простейших сценариев, были добавлены как RunCommand ().
- person Marco van de Voort; 20.02.2016
Просто небольшое дополнение к ответу Марко, использование модуля TProcess подробно описано здесь
Я считаю, что это самый простой способ сделать это. Удачи!
person
Faisal Azahrani
schedule
16.03.2012