此贴为转发红鱼儿的文章,原贴地址: https://www.cnblogs.com/kinglandsoft/p/kbmmw-features-5-kbmmwprocess-unit.html

在新的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功能 - kbmMWProcess单元(转帖)的更多相关文章

  1. kbmMW功能#5 - kbmMWProcess单元

    在新的kbmMW v.5.06.20版本中新加kbmMWProcess单元.通过TkbmMWProcess类的各种类方法,可以轻松地在Windows上对外部进程进行分组,启动和停止.在即将发布的小修补 ...

  2. Delphi 各版本新特性功能网址收集

    Delphi XE2 三个新功能介绍举例_西西软件资讯  http://www.cr173.com/html/13179_1.html delphi 2007新功能简介-davidxueer-Chin ...

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

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

  4. POI生成EXCEL文件(字体、样式、单元格合并、计算公式)

    创建一个封装类: package com.jason.excel; import java.io.FileNotFoundException; import java.io.FileOutputStr ...

  5. 深入delphi编程理解之消息(六)无窗口单元消息的创建、接受及dispatch模式编程

    一.程序界面 二.程序代码 (一).主界面代码 //========================================================================== ...

  6. rpc-1-OSI模型

    rpc-1-OSI模型 第一部分,网络7层协议 1. OSI模型: 开放通信系统互联网参考模型,是国际标准化组织(ISO),提出的一个,试图使各种计算机在世界范围内互连为网络的模式.(遵循这个模式,计 ...

  7. OpenRefine

    无论是现今的大数据还是企业内部的小数据,都存在一些普遍的问题,如数据格式不对需要转换,一个单元格内包含多个含义的内容,包含重复项等等,虽然我们也可以使用excel解决,但是excel天生有诸多限制,比 ...

  8. 免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)

    很多的软件项目几乎都包含着对文档的操作,前面已经介绍过两款操作文档的组件,现在介绍一款文档操作的组件NPOI. NPOI可以生成没有安装在您的服务器上的Microsoft Office套件的Excel ...

  9. Java,来源于大神

    也许你学习了那么久的Java了,但如果有人问你什么是JavaEE?你会怎么回答他呢?在此我来谈谈关于JavaEE的相关技术.(仅是个人见解) 在谈JavaEE时,我们首先来了解一下Java平台.目前, ...

随机推荐

  1. javascript animation lib greensock gsap介绍

    一般前台做动画有以下几种方式: 1. 简单的css transition动画; 2. css animation动画 3. javascript库动画 一般来说css html5动画只适用于简单的形变 ...

  2. CentOS随笔 - 2.CentOS7安装ftp支持(vsftpd)

    前言 转帖请注明出处: http://www.cnblogs.com/Troy-Lv5/ 在前一篇文章中介绍了在虚拟机中安装CentOS7, 接下来就要进行配置了, 第一个就是安装ftp支持. 要不然 ...

  3. java "Too small initial heap" 错误

    Tomcat内存配置 JAVA_OPTS="-server -Duser.timezone=GMT+08-Xms1024m -Xmx1024m -XX:PermSize=1024m -Xmn ...

  4. mysql 的增删改查

    数据库的基本流程就是先看你的数据库中的库都是哪些:show databases; 然后再进入相应的库进行操作  :  use+进入的库/表 切换路径 查看这个库内的所有的表: show tabales ...

  5. 一、python小功能记录——监听键盘事件

    1.监听键盘按键 from pynput.keyboard import Listener def press(key): print(key.char) with Listener(on_press ...

  6. 安装SCOM Gateway Server

    安装SCOM Gateway Server 1.为SCOM Gateway Server申请证书,导入CA证书链2.将安装介质Support Tools下AMD64下的 Microsoft.Enter ...

  7. 在python命令行执行sudo命令

    def test(): sudoPassword = 'test' command = '/opt/lampp/lampp stopmysql' str = os.system('echo %s|su ...

  8. 关于c++ list容器的操作摸索

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/chaoweilanmao/article/details/30793859 #include< ...

  9. 基于session和cookie的登录验证(CBV模式)

    基于session和cookie的登录验证(CBV模式) urls.py """cookie_session URL Configuration The `urlpatt ...

  10. Java集合源码 -- Map映射和Set集合

    Map接口 Map接口是有一个映射表, 存储键和值, 它提供了两个通用的接口HashMap 和 TreeMap HashMap 是散列映射表, 对键散列; Tree是树映射表, 对键进行排序,并将其组 ...