kbmMW功能 - kbmMWProcess单元(转帖)
此貼為轉發紅魚兒的文章,原貼地址:?https://www.cnblogs.com/kinglandsoft/p/kbmmw-features-5-kbmmwprocess-unit.html
在新的kbmMW v.5.06.20版本中新加kbmMWProcess單元。通過TkbmMWProcess類的各種類方法,可以輕松地在Windows上對外部進程進行分組,啟動和停止。
在即將發布的小修補程序中,它還通過實現兩個ExecuteProcess方法進一步擴展TkbmMWProcess功能:
要簡單地啟動外部程序,可以執行以下操作:
1 TkbmMWProcess.CreateProcess('\somepath\some.exe','');some.exe將被啟動并一直運行,直到它自己停止,或者通過任務管理器停止它。如果可執行文件是控制臺類型的應用程序,則將看不到任何可視窗口。
但是,如果您希望能夠輕松地按照自己的意愿關閉已啟動的進程,用下面的代碼實現:
1 var 2 h:THandle; 3 begin 4 h:=TkbmMWProcess.CreateProcess('\somepath\some.exe',''); 5 .... 6 TkbmMWProcess.TerminateProcess(h); 7 end;TerminateProcess將強制關閉外部可執行文件,但不會等待它停止。如果要阻塞直到它已停止,請為TerminateProcess調用添加一個true參數。
1 TkbmMWProcess.TerminateProcess(h,true);但是,如果您想要保證主進程與啟動的所有外部進程一起終止,那么該怎么辦?可以定義一個Job,通過這個Job來管理外部進程:
1 var 2 j:THandle; 3 begin 4 j:=TkbmMWProcess.CreateJob; 5 try 6 TkbmMWProcess.CreateProcess(j,'\somepath\some1.exe',''); 7 TkbmMWProcess.CreateProcess(j,'\somepath\some2.exe',''); 8 .... 9 finally 10 TkbmMWProcess.TerminateJob(j,1); 11 end; 12 end;作業將自動定義,如果您的主可執行文件(包含CreateJob調用)終止,則所有使用CreateProcess(AJob ...)啟動的外部進程將自動終止。
如果您想啟動外部控制臺應用程序,但想要查看其控制臺視圖,該怎么辦?然后我們使用更復雜的CreateProcess版本,并為前4個參數提供0值
1 TkbmMWProcess.CreateProcess(0,0,0,0,'\somepath\some1.exe','','',true);也許您想要接收控制臺應用程序的輸出。例如,我們想取得一個目錄列表(這可以通過許多更原生的方式完成,在這里只是作為示例):
1 var 2 s:string; 3 begin 4 s:=TkbmMWProcess.ExecuteProcess('c:\windows\system32\cmd.exe','/C DIR'); 5 end;將會發生的是它會運行帶有參數的?/C DIR的cmd.exe,來生成當前目錄列表(c:\windows\system32)。在4秒內ExecuteProcess將讀取所有輸出(stdout和stderr)將其作為字符串返回。在4秒(4000毫秒)之后,如果啟動的外部可執行文件尚未終止,則它將自動終止。您可以通過添加不同的ATimeoutMS值來更改等待的最長時間。如果將該值設置為0,它將無限期地等待,直到外部進程終止。ATimeoutMS的分辨率為100?毫秒。
ExecuteProcess也可以參與與上面所示相同的作業,以保證在主可執行文件終止時終止。
最后,通過用戶建議,可以使用ExecuteProcess的其他高級變體,它提供對接收數據的實時訪問。
1 var 2 s:string; 3 begin 4 s:=TkbmMWProcess.ExecuteProcess(0,'C:\Windows\System32\cmd.exe','/C dir', 5 function(var ABuf:PByte; const ABufSize:cardinal; var ASize:cardinal):boolean 6 begin 7 OutputDebugString(PChar('Received '+inttostr(ASize)+' bytes')); 8 Result:=true; 9 end, 10 0,'',false); 11 end;此變體調用提供的匿名函數,帶有3個參數:
- ABuf是指向包含數據的內部緩沖區的指針
- ABufSize是一個包含緩沖區容量的常量
- ASize這是一個告訴實際使用的緩沖區大小的值(為您掃描的實際數據量)。
如果您的匿名函數返回false,您將強制終止外部進程。
如果ABuf為零,則外部進程已終止或終止。
您可以通過ABuf直接在緩沖區指針中修改數據內容并返回一個新的ASize。但請記住這樣做,你必須永遠不要超過ABufSize大小。如果要從字符串中完全跳過數據,可以設置ABuf:= nil,或者如果要返回的數據多于ABufSize中存儲的數據,可以在ABuf中返回指向自己緩沖區的指針和返回的大小在ASize。
任何更改/返回的數據都將是ExecuteProcess返回的最終字符串的一部分。
目前,TkbmMWProcess的功能僅適用于Windows平臺。
?
轉載于:https://www.cnblogs.com/sttchengfei/p/10248148.html
總結
以上是生活随笔為你收集整理的kbmMW功能 - kbmMWProcess单元(转帖)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bzoj 3680 吊打xxx
- 下一篇: dubbo异常处理