酷代码 AI
菜单
全部AI  /  热门  /  AI写代码神器
服务商

用 易语言 语言,帮忙写一个 守护自身 的程序例子,就是打开程序 这个程序会打开一个 守护程序.exe 这个守护程序是用易语言的 windows控制台窗口 写的 然后被守护的程序会发送 一个 本身的 运行信息过去 然后守护程序就开始进行守护,切记 守护程序 和 被守护程序 都是需要你写出来给我

# 易语言守护程序与被守护程序示例 我将为你提供一个完整的易语言守护程序示例,包含被守护程序(`MainApp.exe`)和守护程序(`Guardian.exe`)。 ## 被守护程序 (MainApp.e) ```易语言 .版本 2 .程序集 主程序 .程序集变量 守护进程ID, 整数型 .程序集变量 通信管道, 整数型 .子程序 _启动子程序, 整数型 .局部变量 命令行, 文本型 .局部变量 参数数组, 文本型, , "0" .局部变量 参数个数, 整数型 命令行 = 取命令行 () 参数个数 = 分割文本 (命令行, " ", 参数数组) ' 检查是否由守护程序启动 .如果真 (参数个数 > 0 且 参数数组 [1] = "/guardian") 信息框 ("本程序由守护程序启动", 0, , ) 返回 (0) .如果真结束 ' 启动守护程序 启动守护程序 () ' 主程序循环 .判断循环首 (真) 延时 (1000) 发送心跳 () .判断循环尾 () 返回 (0) .子程序 启动守护程序 .局部变量 守护程序路径, 文本型 .局部变量 启动信息, 启动信息 守护程序路径 = 取运行目录 () + "\Guardian.exe" .如果真 (文件是否存在 (守护程序路径) = 假) 信息框 ("守护程序不存在: " + 守护程序路径, 0, , ) 结束 () .如果真结束 启动信息.命令行 = 取执行文件名 () + " " + 取进程ID () + " " + 取运行目录 () 守护进程ID = 运行 (守护程序路径, 启动信息, ) .如果真 (守护进程ID = 0) 信息框 ("启动守护程序失败", 0, , ) .如果真结束 .子程序 发送心跳 .局部变量 心跳数据, 文本型 .局部变量 发送结果, 逻辑型 心跳数据 = "HEARTBEAT|" + 取进程ID () + "|" + 到文本 (取现行时间 ()) 发送结果 = 发送消息到守护程序 (心跳数据) .如果真 (发送结果 = 假) 信息框 ("发送心跳失败,守护程序可能已退出", 0, , ) 结束 () .如果真结束 .子程序 发送消息到守护程序, 逻辑型 .参数 消息内容, 文本型 .局部变量 管道句柄, 整数型 .局部变量 写入字节数, 整数型 管道句柄 = 打开文件 ("\\.\pipe\GuardianPipe", #读写, ) .如果真 (管道句柄 = 0) 返回 (假) .如果真结束 写入字节数 = 写文件 (管道句柄, 消息内容, 取文本长度 (消息内容)) 关闭文件 (管道句柄) 返回 (写入字节数 = 取文本长度 (消息内容)) ``` ## 守护程序 (Guardian.e) ```易语言 .版本 2 .程序集 守护程序 .程序集变量 主程序ID, 整数型 .程序集变量 主程序路径, 文本型 .程序集变量 工作目录, 文本型 .程序集变量 管道句柄, 整数型 .程序集变量 线程句柄, 整数型 .程序集变量 运行标志, 逻辑型 .子程序 _启动子程序, 整数型 .局部变量 命令行, 文本型 .局部变量 参数数组, 文本型, , "0" .局部变量 参数个数, 整数型 命令行 = 取命令行 () 参数个数 = 分割文本 (命令行, " ", 参数数组) ' 检查参数 .如果真 (参数个数 < 3) 信息框 ("用法: Guardian.exe <主程序ID> <工作目录>", 0, , ) 返回 (0) .如果真结束 主程序ID = 到整数 (参数数组 [1]) 工作目录 = 参数数组 [2] 主程序路径 = 工作目录 + "\" + 取执行文件名 () ' 创建命名管道 创建通信管道 () ' 启动监控线程 运行标志 = 真 线程句柄 = 启动线程 (&监控线程, , ) ' 等待线程结束 等待线程 (线程句柄, -1) 返回 (0) .子程序 创建通信管道 .局部变量 安全属性, SECURITY_ATTRIBUTES 安全属性.nLength = 取结构大小 (安全属性) 安全属性.lpSecurityDescriptor = 0 安全属性.bInheritHandle = 真 管道句柄 = 创建命名管道 ("\\.\pipe\GuardianPipe", #管道_访问双工, #管道_类型消息 | #管道_等待模式, 1, 1024, 1024, 0, 安全属性) .如果真 (管道句柄 = #无效句柄) 信息框 ("创建命名管道失败", 0, , ) 结束 () .如果真结束 .子程序 监控线程 .局部变量 心跳超时, 整数型 .局部变量 最后心跳时间, 日期时间型 .局部变量 当前时间, 日期时间型 .局部变量 消息内容, 文本型 .局部变量 读取结果, 逻辑型 最后心跳时间 = 取现行时间 () 心跳超时 = 5000 ' 5秒超时 .判断循环首 (运行标志) 当前时间 = 取现行时间 () ' 检查主程序是否还在运行 .如果真 (进程是否存在 (主程序ID) = 假) 信息框 ("主程序已退出,尝试重新启动", 0, , ) 重启主程序 () 最后心跳时间 = 取现行时间 () .如果真结束 ' 检查心跳是否超时 .如果真 (取时间间隔 (当前时间, 最后心跳时间, #秒) > 心跳超时 ÷ 1000) 信息框 ("心跳超时,主程序可能无响应", 0, , ) 终止进程 (主程序ID) 延时 (1000) 重启主程序 () 最后心跳时间 = 取现行时间 () .如果真结束 ' 读取管道消息 读取结果 = 读取管道消息 (消息内容) .如果真 (读取结果 且 取文本左边 (消息内容, 10) = "HEARTBEAT|") 最后心跳时间 = 取现行时间 () .如果真结束 延时 (1000) .判断循环尾 () .子程序 读取管道消息, 逻辑型 .参数 消息内容, 文本型, 参考 .局部变量 缓冲区, 文本型 .局部变量 读取字节数, 整数型 缓冲区 = 取空白文本 (1024) 读取字节数 = 读文件 (管道句柄, 缓冲区, 1024) .如果真 (读取字节数 > 0) 消息内容 = 取文本左边 (缓冲区, 读取字节数) 返回 (真) .如果真结束 返回 (假) .子程序 重启主程序 .局部变量 启动信息, 启动信息 .局部变量 新进程ID, 整数型 启动信息.命令行 = 主程序路径 + " /guardian" 启动信息.工作目录 = 工作目录 新进程ID = 运行 (主程序路径, 启动信息, ) .如果真 (新进程ID ≠ 0) 主程序ID = 新进程ID 信息框 ("主程序重启成功,新PID: " + 到文本 (主程序ID), 0, , ) .如果真结束 ``` ## 使用说明 1. 将两个程序分别编译为 `MainApp.exe` 和 `Guardian.exe` 2. 将两个程序放在同一目录下 3. 运行 `MainApp.exe`,它会自动启动 `Guardian.exe` 4. `MainApp.exe` 会定期发送心跳信息给 `Guardian.exe` 5. 如果 `MainApp.exe` 崩溃或无响应,`Guardian.exe` 会自动重启它 ## 注意事项 1. 命名管道通信在Windows系统上有长度限制,心跳消息不宜过长 2. 守护程序使用了线程监控,确保不要频繁创建/销毁线程 3. 实际部署时应移除调试用的信息框,改用日志文件记录 [2025-04-09 23:12:27 | AI写代码神器 | 1863点数解答]

相关提问