kbmMW功能#5 - kbmMWProcess单元
在新的kbmMW v.5.06.20版本中新加kbmMWProcess单元。通过TkbmMWProcess类的各种类方法,可以轻松地在Windows上对外部进程进行分组,启动和停止。
在即将发布的小修补程序中,它还通过实现两个ExecuteProcess方法进一步扩展TkbmMWProcess功能:
TkbmMWProcess = class
public
class function TerminateProcess(const AHandle:THandle; const AExitCode:integer; const AWaitUntilTerminated:boolean = false):boolean;
class function CreateProcess(const AProcessFile:string; const AArgs:string; const AStartupDirectory:string = ''):THandle; overload;
class function CreateProcess(const AJob:THandle; const AProcessFile:string; const AArgs:string; const AStartupDirectory:string = ''):THandle; overload;
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;
class function CreateJob:THandle;
class function TerminateJob(const AHandle:THandle; const AExitCode:integer; const AWaitUntilTerminated:boolean = false):boolean;
class function ExecuteProcess(const AProcessFile:string; const AArgs:string; const ATimeoutMS:integer=; const AStartupDirectory:string = ''; const AShowWindow:boolean = false):string; overload;
class function ExecuteProcess(const AJob:THandle; const AProcessFile:string; const AArgs:string; const ATimeoutMS:integer=; const AStartupDirectory:string = ''; const AShowWindow:boolean = false):string; overload;
end;
要简单地启动外部程序,可以执行以下操作:
TkbmMWProcess.CreateProcess('\somepath\some.exe','');
some.exe将被启动并一直运行,直到它自己停止,或者通过任务管理器停止它。如果可执行文件是控制台类型的应用程序,则将看不到任何可视窗口。
但是,如果您希望能够轻松地按照自己的意愿关闭已启动的进程,用下面的代码实现:
var
h:THandle;
begin
h:=TkbmMWProcess.CreateProcess('\somepath\some.exe','');
....
TkbmMWProcess.TerminateProcess(h);
end;
TerminateProcess将强制关闭外部可执行文件,但不会等待它停止。如果要阻塞直到它已停止,请为TerminateProcess调用添加一个true参数。
TkbmMWProcess.TerminateProcess(h,true);
但是,如果您想要保证主进程与启动的所有外部进程一起终止,那么该怎么办?可以定义一个Job,通过这个Job来管理外部进程:
var
j:THandle;
begin
j:=TkbmMWProcess.CreateJob;
try
TkbmMWProcess.CreateProcess(j,'\somepath\some1.exe','');
TkbmMWProcess.CreateProcess(j,'\somepath\some2.exe','');
....
finally
TkbmMWProcess.TerminateJob(j,);
end;
end;
作业将自动定义,如果您的主可执行文件(包含CreateJob调用)终止,则所有使用CreateProcess(AJob ...)启动的外部进程将自动终止。
如果您想启动外部控制台应用程序,但想要查看其控制台视图,该怎么办?然后我们使用更复杂的CreateProcess版本,并为前4个参数提供0值
TkbmMWProcess.CreateProcess(,,,,'\somepath\some1.exe','','',true);
也许您想要接收控制台应用程序的输出。例如,我们想取得一个目录列表(这可以通过许多更原生的方式完成,在这里只是作为示例):
var
s:string;
begin
s:=TkbmMWProcess.ExecuteProcess('c:\windows\system32\cmd.exe','/C DIR');
end;
将会发生的是它会运行带有参数的 /C DIR的cmd.exe,来生成当前目录列表(c:\windows\system32)。在4秒内ExecuteProcess将读取所有输出(stdout和stderr)将其作为字符串返回。在4秒(4000毫秒)之后,如果启动的外部可执行文件尚未终止,则它将自动终止。您可以通过添加不同的ATimeoutMS值来更改等待的最长时间。如果将该值设置为0,它将无限期地等待,直到外部进程终止。ATimeoutMS的分辨率为100 毫秒。
ExecuteProcess也可以参与与上面所示相同的作业,以保证在主可执行文件终止时终止。
最后,通过用户建议,可以使用ExecuteProcess的其他高级变体,它提供对接收数据的实时访问。
var
s:string;
begin
s:=TkbmMWProcess.ExecuteProcess(,'C:\Windows\System32\cmd.exe','/C dir',
function(var ABuf:PByte; const ABufSize:cardinal; var ASize:cardinal):boolean
begin
OutputDebugString(PChar('Received '+inttostr(ASize)+' bytes'));
Result:=true;
end,
,'',false);
end;
此变体调用提供的匿名函数,带有3个参数:
- ABuf是指向包含数据的内部缓冲区的指针
- ABufSize是一个包含缓冲区容量的常量
- ASize这是一个告诉实际使用的缓冲区大小的值(为您扫描的实际数据量)。
如果您的匿名函数返回false,您将强制终止外部进程。
如果ABuf为零,则外部进程已终止或终止。
您可以通过ABuf直接在缓冲区指针中修改数据内容并返回一个新的ASize。但请记住这样做,你必须永远不要超过ABufSize大小。如果要从字符串中完全跳过数据,可以设置ABuf:= nil,或者如果要返回的数据多于ABufSize中存储的数据,可以在ABuf中返回指向自己缓冲区的指针和返回的大小在ASize。
任何更改/返回的数据都将是ExecuteProcess返回的最终字符串的一部分。
目前,TkbmMWProcess的功能仅适用于Windows平台。
如果您喜欢kbmMW并希望支持我们的工作,请点击推荐并分享此文。
kbmMW功能#5 - kbmMWProcess单元的更多相关文章
- kbmMW功能 - kbmMWProcess单元(转帖)
此贴为转发红鱼儿的文章,原贴地址: https://www.cnblogs.com/kinglandsoft/p/kbmmw-features-5-kbmmwprocess-unit.html 在新的 ...
- Delphi 2010 新增功能之: IOUtils 单元(6): TPath(结构体) 的方法与属性
以后路径相关的处理, 用 IOUtils.TPath 就很方便了. //较常用的方法: TPath.GetTempPath; {获取临时文件夹路径} TPath.Ge ...
- C#在DataGridView中自定义键盘功能——光标在单元格内具体位置
//捕捉按键 protected override bool ProcessCmdKey(ref Message msg,Keys keyData) { if (keyData == Keys.Rig ...
- 个人永久性免费-Excel催化剂功能第62波-单元格区域内数据加解密处理,最有效地保护数据方式
Excel的数据保护能力有限,诸如之前提及过的工作表保护.工作薄保护等,都是十分微弱的保护措施,而对于强保护的工作薄打开密码来说,它像是个总开关一样,要么全不能看,要么就全看到.有这样的场景需求,一份 ...
- 个人永久性免费-Excel催化剂功能第61波-快速锁定解锁单元格及显示隐藏公式
Excel的所有功能都是需求导向的,正因为有客户在企业管理的过程中,有这样的需求出现了,然后相应的Excel就出现了相应的功能来辅助管理,学习Excel的功能,其实真的可以学习到先进企业的许多的管理思 ...
- ABBYY FineReader 15 新增编辑表格单元格功能
ABBYY FineReader 15(Windows系统)新增编辑表格单元格功能,在PDF文档存在表格的前提下,可将表中的每个单元格作为单独的文字块进行单独编辑,单元格内的编辑不会影响同一行中其他单 ...
- Android项目-高考作文功能简介(一)
前言 : 开发安卓也已2年多了近3年了, 在自己刚入行的时候就有自己独立开发一个App的想法. 后来自己做了<<高考作文>>这一App. 后面续续断断的维护者. 也因为功能简 ...
- ExcelPower_Helper插件功能简述与演示
部分功能演示简述: 1.文件目录浏览功能 此功能主要利用了ribbon的dynamicmenu控件,动态呈现自定义目录下的文件列表信息,支持点击打开,查看文件所在目录.功能来源于大神li ...
- 菜鸡谈OO 第二单元总结
“欢迎来到(玄学)多线程的新世界” Homework1 单部傻瓜电梯调度 Part1 多线程设计策略 第一次学到了线程这个概念,与之前的编程体验大有不同.最大的区别在于从原本的线性发生程序变成了多个行 ...
随机推荐
- 20165309 实验四 Android程序设计
2017-2018-2 20165309实验四<Java面向对象程序设计>实验报告 一.实验内容 1.Android Studio的安装测试 2.Activity测试 3.UI测试 4.布 ...
- 2017-2018 ACM-ICPC, NEERC, Northern Subregional ContestG - Grand Test
题意:找三条同起点同终点的不相交的路径 题解:用tarjan的思想,记录两个low表示最小和次小的dfs序,以及最小和次小的位置,如果次小的dfs序比dfn小,那么说明有两条返祖边,那么就是满足条件的 ...
- Java中涉及到金额业务的处理
一.MySql数据库中如何定义关于金额字段: 建议定义成[DECIMAL]类型,而不是float或者是double,因为这个两者是以二进制储存的,存在一定的误差.具体事例可参考https://blog ...
- 使用iText快速更新书签
一.介绍 pdfbox基于Apache协议,商用无需开放源代码. iText基于APGL协议,打包和修改需发布源码,除非花钱买断. 二.用途 下载的电子书,有的书签是FitHeight,也就是缩放后整 ...
- 2017-6-6&6-8/大型网站架构总结
一.WikiPedia(维基百科) WikiPedia是非盈利网站,因此尽可能地使用免费的软件和廉价的服务器.截止到2012年,这个只有区区数百台服务器和十余个技术人员开发.维护的网站,成为流量全球排 ...
- C++类型检查
与大多数语言一样,C++也是类型决定了能对该对象进行的操作,一条表达式是否合法依赖于其中参与运算的对象的类型,C++是一种静态数据类型语言,它的类型检查发生在编译时, 因此编译器知道程序中每一个变量对 ...
- Android AES加密报错处理:javax.crypto.IllegalBlockSizeException: error:1e00007b:Cipher functions:OPENSSL_internal:WRONG_FINAL_BLOCK_LENGTH
一.问题说明 今天写AES加/解密功能的apk,设想是四个控件(测试用的,界面丑这种东西请忽略) 一个编缉框----用于输入要加密的字符串 一个文本框----用于输出加密后的字符串,和加密后点击解密按 ...
- burpsuite只拦截特定网站数据包教程
一.背景说明 在配置burpsuite代理截包时经常会遇到这样的情况: 浏览器经常自己发一些包(收集用户信息),干挠渗透测试人员对目标网站的检测: 如果是代理手机,那就是很多APP都时不时发一些包,干 ...
- Oracle常用表和常见操作命令
一.说明 Oracle数据库数据库名.表名.字段名等不区分大小写,字段值区分大小写. Oracle单词之间一般用下划线连接:表名最后一般加s字段名最后一般没s. 二.常见数据表 dba_*DBA拥有的 ...
- Python自然语言处理---信息提取
1.数据 目前的数据总体上分为结构化和非结构化的数据.结构化的数据是指实体和关系的规范和可预测的组织.大部分的需要处理的数据都属于非结构化的数据. 2.信息提取 简言之就是从文本中获取信息意义的方法. ...