# 易语言守护程序与被守护程序示例 我将为你提供一个完整的易语言守护程序解决方案,包含被守护程序(`MainApp.exe`)和守护程序(`Guardian.exe`)。 ## 被守护程序 (MainApp.e) ```易语言 .版本 2 .程序集 主程序 .程序集变量 守护进程路径, 文本型 .程序集变量 守护进程句柄, 整数型 .程序集变量 通信管道, 整数型 .程序集变量 计时器, 整数型 .子程序 _启动子程序, 整数型 .局部变量 参数, 文本型, , "0" 守护进程路径 = 取运行目录 () + “\Guardian.exe” 通信管道 = 创建命名管道 (“\\.\pipe\MainAppGuardian”, 1, 0, 255, 1024, 1024, 0, 0) 如果 (文件是否存在 (守护进程路径)) 运行 (守护进程路径, 假, #隐藏窗口, 守护进程句柄) 延时 (1000) 发送心跳 () 计时器 = 时钟1.时钟周期 = 5000 ' 5秒发送一次心跳 否则 信息框 (“守护程序不存在!”, 0, , ) 返回 (0) 结束 如果 返回 (0) .子程序 发送心跳 .局部变量 消息, 文本型 .局部变量 写入长度, 整数型 消息 = “心跳|” + 到文本 (取现行时间 ()) + “|” + 到文本 (取进程ID ()) CallNamedPipe (“\\.\pipe\MainAppGuardian”, 消息, 取文本长度 (消息), 0, 0, 0, 0) .子程序 时钟1_周期事件 发送心跳 () .子程序 __启动窗口_将被销毁 关闭管道 (通信管道) 终止进程 (守护进程句柄) ``` ## 守护程序 (Guardian.e) ```易语言 .版本 2 .程序集 守护程序 .程序集变量 主程序路径, 文本型 .程序集变量 主程序句柄, 整数型 .程序集变量 通信管道, 整数型 .程序集变量 最后心跳时间, 日期时间型 .程序集变量 计时器, 整数型 .子程序 _启动子程序, 整数型 .局部变量 参数, 文本型, , "0" 主程序路径 = 取运行目录 () + “\MainApp.exe” 通信管道 = 创建命名管道 (“\\.\pipe\MainAppGuardian”, 2, 0, 255, 1024, 1024, 0, 0) 如果 (文件是否存在 (主程序路径)) 计时器 = 时钟1.时钟周期 = 10000 ' 10秒检查一次 否则 信息框 (“主程序不存在!”, 0, , ) 返回 (0) 结束 如果 返回 (0) .子程序 时钟1_周期事件 .局部变量 消息, 文本型 .局部变量 读取长度, 整数型 .局部变量 缓冲区, 文本型 缓冲区 = 取空白文本 (1024) 读取长度 = 读管道 (通信管道, 缓冲区, 1024, 0) 如果 (读取长度 > 0) 消息 = 取文本左边 (缓冲区, 读取长度) 如果 (寻找文本 (消息, “心跳”, , 假) ≠ -1) 最后心跳时间 = 取现行时间 () 返回 () 结束 如果 否则 ' 检查主程序是否运行 如果 (取进程是否存在 (“MainApp.exe”) = 假) 运行 (主程序路径, 假, #普通激活, 主程序句柄) 结束 如果 ' 检查心跳超时 (30秒无心跳) 如果 (取时间间隔 (取现行时间 (), 最后心跳时间, #秒) > 30) 终止进程 (取进程ID (“MainApp.exe”)) 运行 (主程序路径, 假, #普通激活, 主程序句柄) 结束 如果 结束 如果 .子程序 __启动窗口_将被销毁 关闭管道 (通信管道) ``` ## 实现说明 1. 通信机制:使用Windows命名管道进行进程间通信 2. 心跳检测:被守护程序每5秒发送一次心跳信息 3. 守护逻辑:守护程序每10秒检查一次,如果30秒内没有收到心跳或主进程不存在,则重启主程序 4. 窗口设置:守护程序使用控制台窗口(在易语言中通过`#隐藏窗口`参数实现) ## 注意事项 1. 两个程序需要编译后放在同一目录下 2. 守护程序需要先启动被守护程序 3. 命名管道名称`\\.\pipe\MainAppGuardian`可以自定义,但要确保两个程序使用相同的名称 ## 三条额外需要注意的逻辑点 1. 命名管道的创建和使用需要管理员权限,在Windows Vista及以上系统可能需要以管理员身份运行程序 2. 心跳间隔和超时时间可以根据实际需求调整,但要确保心跳间隔小于超时时间 3. 在实际部署时,需要考虑守护程序自身的可靠性,可以添加守护程序的自我监控机制 [2025-04-09 23:14:23 | AI写代码神器 | 1163点数解答]