2015-03-13 141 views
0

我想捕獲cmd.exe輸出並將其顯示在我製作的不同GUI中。我想製作一個擴展功能的命令解釋器。 dir命令的工作完美無瑕,當我嘗試執行另一個進程(如ipconfig)時,問題仍然存在。捕獲所有命令輸出

我看不到ipconfig輸出。有沒有一個workarround呢?!

我使用拉撒路(FreePascal的)T加工組件

proc := TProcess.Create(nil); 
    proc.Options:= [poUsePipes, poNoConsole]; 
    proc.ShowWindow:= swoHIDE; 
    proc.Executable:= 'cmd'; 

讀輸出線:

if (Length(cmd) > 0) then 
     begin 
     cmd := cmd + #13#10; 
     proc.Input.Write(cmd[1], Length(cmd)); // here I write command from user 
     strikes := 0; 
     end 
     else 
     if proc.Output.NumBytesAvailable > 0 then 
     begin 
      while proc.Output.NumBytesAvailable > 0 do 
      begin 
       FillChar(buf, sizeof(buf), #0); 
       proc.Output.Read(buf, sizeof(buf) - 1); 
       data := data + buf; 
      end;      

     // data gets echoed to user 
+0

我們看不到您的代碼。 – 2015-03-13 12:53:04

+0

@DavidHeffernan我使用lazarus套件中的TProcess,這是創建標誌。不要認爲代碼錯誤 – opc0de 2015-03-13 12:58:56

+0

'proc.ShowWindow'沒有任何用處。這是一個控制檯應用程序,「poNoConsole」是最重要的。如果你展示了一個完整的程序,將有所幫助。 – 2015-03-13 13:03:20

回答

1

它工作正常,我(我用FPC 3.1.1 &拉撒路1.5,但我希望它無所謂):

proc.Options:= [poUsePipes]; 
proc.ShowWindow:= swoHIDE; 
proc.Executable:= 'cmd'; 
... 

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); 
var 
    cmd: String; 
begin 
    if Key = #13 then 
    begin 
     Key := #0; 
     if not proc.Active then 
      proc.Active := True; 
     cmd := Edit1.Text + LineEnding; 
     proc.Input.Write(cmd[1], Length(cmd)); 
    end; 
end; 

procedure TForm1.Timer1Timer(Sender: TObject); 
var 
    buf: array[0..65535] of Char; 
begin 
    if proc.Output.NumBytesAvailable > 0 then 
    begin 
     while proc.Output.NumBytesAvailable > 0 do 
     begin 
      FillChar(buf, sizeof(buf), #0); 
      proc.Output.Read(buf, sizeof(buf) - 1); 
      Memo1.Lines.Add(buf); 
     end; 
    end; 
end; 

我想你只是不趕上過程ss輸出正常。 祝你好運。 PS:如果您需要創建一些類似Windows控制檯的應用程序,我認爲最好的方法是使用Windows console API而不是跨平臺的Lazarus組件。

PPS:模仿Lazarus使用CmdLine組件的控制檯外觀和行爲。

+0

從組件創建例程中刪除了poNoConsole,它工作正常!感謝您的幫助bro – opc0de 2015-03-14 06:36:35

1

一般來說它是智能如果短例子不解決問題首先檢查:

例如

uses process; 

var s : ansistring; 
begin 
    runcommand('ipconfig',['/all'],s); 
    writeln(s); 
end. 

工作正常,並節省了很多麻煩。 (FPC 2.6.2以上)