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平台。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!