此贴为转发红鱼儿的文章,原贴地址: 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单元(转帖)相关推荐

  1. E9表单按钮置灰功能与单元格自定义属性说明

    1:表单单元格自定义按钮配置说明 1.1:选中需要设置按钮的单元格 1.2:设置单元格自定义属性 鼠标右键====>设置自定义属性====>id.name.class 如下图: 1.3:插 ...

  2. 6.8 使用迷你图功能在单元格中插入图表 [原创Excel教程]

    原文:http://coolketang.com/staticOffice/5a97f34eac502e0032eb0778.html 1. 本节课将为您演示迷你图的使用.迷你图是一种全新的图表制作工 ...

  3. 间隔单元装置主要功能

    3.3间隔单元装置主要功能 所内间隔单元装置是指在开关柜本体控制小室内安装的微机保护测控一体化设备 (接触网电动隔离开关监控单元则安装在控制信号盘上),主要包括各种测控.保护及操作按钮等功能设备. 3 ...

  4. 计算机联锁与全电子执行单元,计算机联锁全电子执行单元.doc

    文档介绍: 概述全电子执行单元采用计算机技术.电子信息技术.电力电子开关技术.自动控制技术,替代了6502电气集中以安全型继电器作为控制单元的电路形式,与联锁计算机相结合,完成了计算机联锁系统的末级控 ...

  5. 在Eclipse中使用JUnit4进行单元測试(0基础篇)

    本文绝大部分内容引自这篇文章: http://www.devx.com/Java/Article/31983/0/page/1 我们在编写大型程序的时候,须要写成千上万个方法或函数,这些函数的功能可能 ...

  6. Cerebral Cortex:基因和环境对大脑功能连接的影响

    <本文同步发布于"脑之说"微信公众号,欢迎搜索关注~~> 详细绘制基因和环境对功能连接体的影响是发展基因与临床诊断或认知能力之间的中间表型的关键一步.我们分析了来自两个 ...

  7. Word/Excel文档操作API哪家强?一张表带你了解Aspose和Spire系列全功能对比

    Microsoft Office是微软公司的一个文字处理器应用程序,作为办公软件必不可少的神器之一,其中Word.Excel是日常工作中常用的文档管理工具.目前,Aspose系列和Spire系列是文档 ...

  8. 网络基础(二)OSI 网络七层各层功能 --难理解

    注:本文以书刊形式展示 Cisco七层协议,并不以知识点 经验为题,建议闲暇时间观看 OSI 网络七层协议(Open System Interconnection),简称OSI,是一个开放性的通行系统 ...

  9. Excel常用的单元格格式

    需求 甲方们不仅要五彩斑斓的黑,还要既大又小的字体.这次的需求看起来也是这样的 老板:举个例子,这个数字123456,我要呢,它在Excel里面还是123456,这样我就不会计算错误.但是为了方便阅读 ...

最新文章

  1. Google正式发布TensorFlow Lite预览版,针对移动/嵌入设备的轻量级解决方案
  2. django-pagination 样式修改
  3. 电气:通过转移因子算法求解潮流
  4. Springmvc入门案例(1)
  5. 工业交换机厂家有哪些?工业交换机十大品牌供应商!
  6. android 开机动画尺寸,Android开机Logo动画制作
  7. mysql 大小写敏感设置_MySQL 中的大小写敏感设置
  8. Linux环境搭建 | 全能终端神器——MobaXterm
  9. python没有报错但是没结果_python爬取豆瓣top250的电影的信息,没有报错哦,但是没有结果...
  10. git学习笔记(1-集中式与分布式版本控制工具对比)
  11. 购买地铁车票的规定如下: 乘1-4站,3元/位;乘5-9站,4元/位; 乘9站以上,5元/位。 输入乘坐人数(per_num)和乘坐站数(sta_num), 计算购买地铁车票需要的总金额,并将计算结果
  12. 世界上有10种人,一种是懂二进制的人,一种是不懂二进制的人。
  13. 2023年CISSP考点及预约时间参考
  14. 关于win10输入法问题(打不出中文)解决方法
  15. 串口实现PC之间传输文件
  16. 3、TextBox 控件
  17. 中国碗扣式脚手架行业市场供需与战略研究报告
  18. send disconnect: Broken pipe SFTP 登录
  19. 海外版抖音TikTok运营实战
  20. FreeRTOS学习笔记<中断>

热门文章

  1. 阿里云中间件首席架构师李小平:云原生实践助力企业高效创新
  2. Flagger on ASM——基于Mixerless Telemetry实现渐进式灰度发布系列 2 应用级扩缩容
  3. 深度解析 | 基于DAG的分布式任务调度平台:Maat
  4. 分享:游戏新手引导程序框架设计3要点
  5. 数据库面试题【十四、主键使用自增ID还是UUID】
  6. 运行脚本时用SPOOL保存运行结果的问题
  7. 使用SQLPLUS生成HTML报表
  8. 常见的社会潜规则有哪些?
  9. Tomcat可运行源码资源分享
  10. 实验九 根据材料编程