process库提供进程管理函数。
什么是进程
进程( process )是指一个正在执行的程序,一个计算机中的可执行 EXE 文件在运行后创建的程序实例。进程是由进程控制块、程序段、数据段组成。一个进程可以包含若干线程(Thread),线程可以并发执行。
进程ID
进程被创建时,系统会赋给它一个唯一的标识符,这就是进程 ID。系统中运行的其他进程不会有相同的 ID 值,这个值也是可以被使用的,例如父进程可以通过创建子进程时得到的 ID 来和子进程通信。
在 aardio 中进程 ID 是一个数值。
进程句柄
进程对象是一种内核对象,每个内核对象实际上是由内核分配的一块内存,而且只能由内核来访问。这一内存块是一个数据结构,它的成员包含有关于该对象的信息。当调用创建内核对象的函数时,函数返回一个标志该对象的句柄。进程句柄可以被进程中的任意线程使用,可以把它传给各种 WIN32 函数,这样系统就知道想要操纵的是哪一个内核对象.
在 aardio 中进程句柄是一个指针对象。
进程对象
aardio 的 process 库提供 process 类可以创建进程控制对象,可以启动进程或打开现有进程,获取进程内核对象的句,并提供一系列管理、控制目标进程的函数。
函数原型:
//无参数返回当前进程对象
prcs = process()
//传入进程ID打开已运行的进程对象
prcs = process( 进程ID )
//运行可执行文件,创建新的进程,可选传入任意个数文本参数
prcs = process( "exe执行2文件路径","启动参数1", "启动参数2" ... )
//运行可执行文件,创建新的进程,可选用 startInfo 参数指定启动选项
prcs = process( "exe执行2文件路径",启动参数, startInfo)
函数说明:
process 是一个类,用于创建进程对象。 而process 类的构造函数支持动态的参数,有四种用法:
调用示例:
import process;
//创建进程并且暂停进程
var prcs = process( "请指定程序路径.exe",,{suspended = true /*启动后停止运行*/} )
//继续执行线程
thread.resume( prcs.thandle )
在本文档中,使用 prcs 表示 process 类构造的进程实例。
更多进程属性请参考 《 process 库参考 》
函数原型:
prcs.free()
函数说明:
关闭进程对象,指释放进程句柄,并非关闭目标进程(停止运行)。
函数原型:
prcs.terminate()
函数说明:
强制杀除目标进程,使之停止运行。 这是暴力中断进程,不宜太多使用,因为目标进程没有机会去做退出时释放资源保存数据的操作。
如果是窗口程序,可尝试调用 prcs.closeMainWindow() 函数关闭进程主窗口能否退出程序。
调用示例:
import process;
//创建进程对象
var prcs = process( "目标程序路径.exe" ) //注意这里必须要是绝对路径
thread.delay(1000)
//杀除进程
prcs.terminate()
函数原型:
num = prcs.readNumber ( 目标进程内存地址,"原生数据类型" )
函数说明:
自目标进程的指定内存地址,读取指定类型据类型的数字值.请参考:原生数据类型
可选的类型有:"int" "byte","word","long" 以及无符号数值数据 "INT","BYTE","WORD","LONG"。
函数原型:
prcs.writeNumber ( 目标进程内存地址,要写入的数值,"原生数据类型" )
函数说明:
向目标进程的指定内存地址,写入指定类型据类型的数字值.请参考:原生数据类型
可选的类型有:"int" "byte","word","long"以及无符号数值数据"INT","BYTE","WORD","LONG"。
调用示例:
import process;
import fsys;
//创建进程对象
var prcs = process( "目标程序路径.exe" ) //注意这里必须要是绝对路径
var n = prcs.readNumber( 0x101d1,"word" ); //读内存 word 类型数值
prcs.writeNumber(0x101d1,n,"word"); //写入内存 word 类型数值
函数原型:
prcs.readString(目标进程内存地址,要读取的字符串长度)
函数说明:
自目标进程的指定内存地址,读取指定长度的字符串值。
函数原型:
prcs.writeString(目标进程内存地址,要写入的字符串)
函数说明:
向目标进程的指定内存地址,写入指定长度的字符串值。
函数原型:
addr = prcs.malloc ( 要分配的内存长度,访问类型,分配类型 )
函数说明:
在目标进程分配内存,分配类型与访问类型可省略。此函数分配的内存默认可读写、可执行,可以用于写入机器码等。
也可以显式指定分配类型与访问类型(一般无此必要),访问类型为 PAGE 前缀的常量,而分配类型为 MEM 前缀的常量。
在『开发环境』中输入该前缀可自动显示相关常量。
函数原型:
prcs.mfree( 内存地址,释放长度=0,释放类型=0x8000 )
函数说明:
该函数用于释放 prcs.malloc 分配的内存地址。 请注意此函数名字为 memery free 的缩写,首字母 m 表示memery(内存),注意与 prcs.free() 区别。
第二个参数,第三个参数通常不需要指定。 如果将第三个参数指定为 0x4000,则仅仅释放指定长度的内存,这种方式释放不彻底,内存页还将存在。一般不应显式指定第二个参数以及第三个参数。
函数原型:
remoteFunc = prcs.remoteApi( 函数原型, 这里是函数地址,调用约定="stdcall" )
remoteFunc = prcs.remoteApi( 函数原型, DLL文件名,函数名字,调用约定="stdcall" )
函数说明:
该函数内部实际上是调用 raw.remoteApi, 所有参数用法与 raw.remoteApi 相同,唯一的区别是不需要使用进程 ID 参数。
请参考: raw.remoteApi
使用 process 库启动的进程对象可以获取更高的权限,因此推荐使用 prcs.remoteApi 来代替 raw.remoteApi 。
注意:不是所有目标进程能都支持这个功能。
函数原型:
process.execute( EXE文件路径, 启动参数="",操作类型 = "open",显示属性,工作目录="",调用窗口句柄=0 )
函数说明:
运行EXE程序,除第一个参数以外,其他参数可选。 aardio 应用程序根目录路径,也支持系统目录下的相对路径。 此函数与 Windows 开始菜单里的"运行"功能类似,在"开始菜单->运行"中可以输入的指令,在这里也可以直接输入。
第三个参数可选的操作类型:
第四个参数:显示属性使用 _SW_
开头的常量,在开发环境中输入 _SW_
会自动提示可用的常量。例如 0/*_SW_HIDE*/
表示隐藏窗口。
调用示例
import process
//直接运行,系统程序可以使用相对路径
process.execute( "Explorer.exe"," /select," + io._exepath )
函数原型:
process.executeWait( EXE文件路径, 启动参数="",操作类型 = "open",显示属性 ,工作目录="",调用窗口句柄=0 )
函数说明:
此函数与 process.execute用法完全相同,唯一的区别是会等待目标程序关闭再返回。
函数原型:
process.exploreSelect( 文件路径 )
函数说明:
打开资源管理器,并选定该文件.
调用示例:
以下示例打开资源管理器,并选定截屏图像文件。
import process
import com.picture;
var pic = com.picture.snap()//抓屏
pic.Save( "/抓屏.jpg" )
//打开浏览器,选定该文件
process.exploreSelect("/抓屏.jpg")
函数原型:
process.kill( exe文件名 )
函数说明:
根据 EXE 文件名杀除进程。
调用示例:
import process
//关闭所有同名进程
process.kill( "指定要关闭的执行程序名称.exe" )
函数原型:
for processEntry in process.each( exeFileName ) {
}
函数说明:
查找参数 @exeFileName 指定 EXE 文件名的进程,并且循环遍历找到的进程。
查找时支持完全匹配、模式匹配,并且忽略大小写。
参考:
调用示例:
import console;
import process;
for processEntry in process.each( ".*.exe" ) {
console.log("进程ID",processEntry.th32ProcessID);
console.log("进程文件名", processEntry.szExeFile);
}
console.pause();