Delphi 6 - read console app's output while running

后端 未结 3 387
忘了有多久
忘了有多久 2020-12-05 12:41

How do I read a console apps output as it is running. I start the console application and would like to read the output as it is printed by the console app.

相关标签:
3条回答
  • 2020-12-05 12:57

    I usually use this ported FPC code: http://www.stack.nl/~marcov/processdelphi.zip

    It contains a class to control external programs (it is the class used by Lazarus to call the cmdline compiler and other programs).

    Documentation is here, but the delphi port is a bit old, so not all documented properties might exist in the above version.

    http://www.freepascal.org/docs-html/fcl/process/index.html

    0 讨论(0)
  • 2020-12-05 12:59

    Just a small addition to Marco answer, using the TProcess unit is thoroughly explained here

    I believe this is the easiest way to do it. Good luck!

    0 讨论(0)
  • 2020-12-05 13:18

    What about this solution.


    EDIT: the link leads to this solution (lightly refactored for legibility and to remove use of 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;
    
    0 讨论(0)
提交回复
热议问题