procedure CaptureConsoleOutput(const ACommand,AParameters: String; CallBack: TArg<PAnsiChar>);const CReadBuffer = 2400;var saSecurity: TSecurityAttributes; hRead: THandle; hWrite: THandle; suiStartup: TStartupInfo; piProcess: TProcessinformation; pBuffer: array [0 .. CReadBuffer] of AnsiChar; dBuffer: array [0 .. CReadBuffer] of AnsiChar; dRead: DWord; dRunning: DWord;begin saSecurity.nLength := SizeOf(TSecurityAttributes); saSecurity.b@R_419_5107@Handle := True; saSecurity.lpSecurityDescriptor := nil; if CreatePipe(hRead,hWrite,@saSecurity,0) then begin FillChar(suiStartup,SizeOf(TStartupInfo),#0); suiStartup.cb := SizeOf(TStartupInfo); suiStartup.hStdinput := hRead; suiStartup.hStdOutput := hWrite; suiStartup.hStdError := hWrite; suiStartup.DWFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW; suiStartup.wShowWindow := SW_HIDE; if CreateProcess(nil,pChar(ACommand + ' ' + AParameters),True,norMAL_PRIORITY_CLASS,nil,suiStartup,piProcess) then begin repeat dRunning := WaitForSingleObject(piProcess.hProcess,100); //Application.ProcessMessages(); repeat dRead := 0; Readfile(hRead,pBuffer[0],CReadBuffer,dRead,nil); if(dRead > 0) then begin pBuffer[dRead] := #0; //ShowMessage(pBuffer); //OemToAnsi(pBuffer,pBuffer); //Unicode support by lars Fosdal Oemtochara(pBuffer,dBuffer); CallBack(dBuffer); end; until (dRead < CReadBuffer); until (dRunning <> WAIT_TIMEOUT); CloseHandle(piProcess.hProcess); CloseHandle(piProcess.hThread); end; CloseHandle(hRead); CloseHandle(hWrite); end;end;
这很好,但是因为程序没有“退出”并永远保持打开状态,我的应用程序挂起,代码永远不会移动.
任何帮助,将不胜感激
解决方法 如果您不需要对生成的进程执行任何 *** 作,则只需关闭CreateProcess()返回的句柄并继续,该进程将继续运行.但是,由于您似乎需要从生成的进程的输出中连续读取,您只需将该逻辑移动到工作线程中,这样您的主代码就不会被阻止了. 总结以上是内存溢出为你收集整理的delphi – 执行后台程序并继续执行代码?全部内容,希望文章能够帮你解决delphi – 执行后台程序并继续执行代码?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)