OK, since no one answers this in Lazarus forum, I'll ask here as it's more FPC (FCL, actually) related than LCL. I want to create an interactive process, so I need to read the output as soon as it's available and write it to the screen (or somewhere else). Here's the partial code (a little different from the original post to avoid visual component):
var CmdProcess: TProcess; MemStr: TMemoryStream; StrList: TStringList; n: Integer; ErrMsg: PChar; begin try CmdProcess:=TProcess.Create(nil); MemStr:=TMemoryStream.Create; StrList:=TStringList.Create; MemStr.SetSize(READ_BYTES); with CmdProcess do begin CommandLine:=InputStr; Options:=[poUsePipes,poStderrToOutPut]; ShowWindow:=swoHide; Execute; while Running do begin n:=Output.Read(MemStr.Memory^,READ_BYTES); if n>0 then begin StrList.LoadFromStream(MemStr); WriteLn(StrList.Text); MemStr.Clear; end else Sleep(100); end; end; except on e: EProcess do begin {$IFDEF Windows} FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM, nil,GetLastError,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), @ErrMsg,0,nil ); {$ELSE} ErrMsg:=...@e.message[1]; {$ENDIF} WriteLn(ErrMsg); Exit; end; on e: Exception do begin MessageDlg('Error',e.Message,mtError,[mbOK],0); Exit; end; end; repeat n:=CmdProcess.Output.Read(MemStr.Memory^,READ_BYTES); if n>0 then begin StrList.LoadFromStream(MemStr); WriteLn(StrList.Text); end; until n<=0; StrList.Free; MemStr.Free; CmdProcess.Free; end; -- View this message in context: http://www.nabble.com/Interactive-process-with-TProcess-tp21029222p21029222.html Sent from the Free Pascal - General mailing list archive at Nabble.com. _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal