日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

kbmMW功能 - kbmMWProcess单元(转帖)

發布時間:2024/7/5 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 = class 2 public 3 class function TerminateProcess(const AHandle:THandle; const AExitCode:integer; const AWaitUntilTerminated:boolean = false):boolean; 4 class function CreateProcess(const AProcessFile:string; const AArgs:string; const AStartupDirectory:string = ''):THandle; overload; 5 class function CreateProcess(const AJob:THandle; const AProcessFile:string; const AArgs:string; const AStartupDirectory:string = ''):THandle; overload; 6 class function CreateProcess(const AJob:THandle; const AInput:THandle; const AOutput:THandle; const AErr:THandle; const AProcessFile:string; const AArgs:string; const AStartupDirectory:string = ''; const AShowWindow:boolean=false):THandle; overload; 7 class function CreateJob:THandle; 8 class function TerminateJob(const AHandle:THandle; const AExitCode:integer; const AWaitUntilTerminated:boolean = false):boolean; 9 class function ExecuteProcess(const AProcessFile:string; const AArgs:string; const ATimeoutMS:integer=4000; const AStartupDirectory:string = ''; const AShowWindow:boolean = false):string; overload; 10 class function ExecuteProcess(const AJob:THandle; const AProcessFile:string; const AArgs:string; const ATimeoutMS:integer=4000; const AStartupDirectory:string = ''; const AShowWindow:boolean = false):string; overload; 11 end;

要簡單地啟動外部程序,可以執行以下操作:

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单元(转帖)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。