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