您的位置:首页 > 编程开发 > 易语言

进程结束后关闭另一个进程

:6.936KB :2021-02-06 12:56:46

' 示例:当前我们自己为A进程
' 我们需要让B进程退出时C进程也跟着退出。
' 请看代码一步步的操作和解释。
' hC = A->Open(C)
hProcess = VOpen (hRemoteProcessId) ' 因为需要C等待B关闭了退出,C就是主动监视B进程了,我们打开C进程。
.如果真 (hProcess = 0)
返回 (假)
.如果真结束
' hB = C->Open(B)
rhProcess = RemoteOpenProcess (hProcess, 位或 (#PROCESS_TERMINATE, #SYNCHRONIZE), 假, hWaitProcessId) ' 让C进程打开B进程,我们得到的返回值就为C进程打开的B进程句柄
.如果真 (rhProcess = 0)
VClose (rhProcess)
返回 (假)
.如果真结束
' 构造等待函数指令
重定义数组 (Arg, 假, 2) ' 重新定义WaitForSingleObject的参数数量
Arg [1] = rhProcess ' 参数为C进程打开的B进程句柄。
Arg [2] = -1 ' 无限等待时间
Wait.Addr = GetAddress (“kernel32.dll”, “WaitForSingleObject”)
Wait.Code = MakeCallCode (Wait.Addr, Arg)
' 构造关闭句柄指令
重定义数组 (Arg, 假, 1) ' 重新定义CloseHandle的参数数量
Arg [1] = rhProcess ' 参数为C进程打开的B进程句柄。
Close.Addr = GetAddress (“kernel32.dll”, “CloseHandle”)
Close.Code = MakeCallCode (Close.Addr, Arg)
' 构造终止进程函数指令
重定义数组 (Arg, 假, 2) ' 重新定义WaitForSingleObject的参数数量
Arg [1] = -1 ' 为C进程自己的伪句柄
Terminate.Addr = GetAddress (“kernel32.dll”, “TerminateProcess”)
Terminate.Code = MakeCallCode (Terminate.Addr, Arg)
' 修改指令
' 每构造一个函数调用指令,最后的代码为返回retn
' 因为我们在Wait后不能返回,Close也不能返回,Terminate后才能返回
' 所以要修改指令,替换掉Wait后两个的retn和nop指令,
Wait.Code = 取字节集左边 (Wait.Code, 取字节集长度 (Wait.Code) - 2)
Close.Code = 取字节集左边 (Close.Code, 取字节集长度 (Close.Code) - 2)
Code = Wait.Code + Close.Code + Terminate.Code ' 合并指令
' 当前为止,用函数来表达就是下面的意思
' ----------表达为C进程里调用的函数.
' hProcess = OpenProcess (位或 (#PROCESS_TERMINATE, #SYNCHRONIZE), 假, hB_PID) '打开B进程,我们已经事先远程实现了
' '如下为远程调用的指令
' WaitForSingleObject (hProcess, -1) '等待远程进程关闭
' CloseHandle (hProcess) '关闭打开的进程句柄
' TerminateProcess (GetCurrentProcess(), 0) '结束自己
' 返回() '自己都已经结束自己了,哪还来的这句~~@_@
' ----------
' 在C进程分配空间,来存放指令
lpAddr = VAlloc (hProcess, 取字节集长度 (Code))
.如果真 (lpAddr = 0) ' 如果分配失败
RemoteCloseHandle (hProcess, rhProcess) ' 在C进程关闭打开的B进程句柄
VClose (hProcess) ' 关闭C进程句柄
返回 (假)
.如果真结束
' 将指令写入到C进程
.如果真 (VWrite (hProcess, lpAddr, GetBinPtr (Code), 取字节集长度 (Code)) = 假) ' 如果分配失败
VFree (hProcess, lpAddr) ' 释放C进程的指令空间
RemoteCloseHandle (hProcess, rhProcess)
VClose (hProcess)
返回 (假)
.如果真结束
' 创建远程线程,运行这段指令,让C进程进入等待B的操作
hThread = CreateRemoteThread (hProcess, 0, 0, lpAddr, 0, 0, 0) ' 创建远程线程,让C进程执行指令
CloseHandle (hThread)
VClose (hProcess)
易语言进程结束后关闭另一个进程例子。

运行后电脑桌面窗口抖动
驱动读写开源,支持最新1909系统

同类资源