# 易语言守护程序与被守护程序示例 我将为你提供一个完整的易语言守护程序解决方案,包含守护程序(`守护程序.exe`)和被守护程序(`主程序.exe`)。 ## 被守护程序(主程序.exe) ```易语言 .版本 2 .程序集 主程序 .程序集变量 守护进程ID, 整数型 .程序集变量 通信句柄, 整数型 .子程序 __启动窗口_创建完毕 启动守护程序 () 延时 (1000) ' 等待守护程序启动 发送运行信息 () .子程序 启动守护程序 .局部变量 执行结果, 整数型 .局部变量 启动信息, 启动信息 启动信息.执行文件名 = 取运行目录 () + “\守护程序.exe” 启动信息.显示方式 = #隐藏窗口 执行结果 = 运行 (启动信息, 假, 守护进程ID) 如果 (执行结果 = 0) 则 信息框 (“无法启动守护程序”, 0, “错误”) 结束 () 结束 如果 .子程序 发送运行信息 .局部变量 进程ID, 整数型 .局部变量 窗口, 文本型 进程ID = 取进程ID () 窗口 = “主程序 - ” + 到文本 (进程ID) 置窗口 (窗口) ' 查找守护程序的通信窗口 通信句柄 = 寻找窗口 (“守护程序通信窗口”, “”) 如果 (通信句柄 = 0) 则 信息框 (“无法找到守护程序通信窗口”, 0, “错误”) 结束 () 结束 如果 ' 发送运行信息给守护程序 发送消息 (通信句柄, 1024, 进程ID, 0) .子程序 __启动窗口_将被销毁 ' 通知守护程序本程序即将退出 发送消息 (通信句柄, 1025, 0, 0) ``` ## 守护程序(守护程序.exe) ```易语言 .版本 2 .程序集 守护程序 .程序集变量 被守护进程ID, 整数型 .程序集变量 通信窗口句柄, 整数型 .程序集变量 定时器ID, 整数型 .子程序 __启动窗口_创建完毕 置窗口 (“守护程序通信窗口”) 隐藏 () ' 设置定时器,每5秒检查一次主程序状态 定时器ID = 置定时器 (5000, &检查主程序状态) .子程序 _守护程序_可否被关闭, 逻辑型 返回 (假) ' 防止用户关闭守护程序 .子程序 __启动窗口_收到消息 .参数 消息值, 整数型 .参数 参数1, 整数型 .参数 参数2, 整数型 判断 (消息值) 判断开始 (消息值 = 1024) ' 收到主程序的运行信息 被守护进程ID = 参数1 输出调试文本 (“收到主程序进程ID: ”, 被守护进程ID) 判断 (消息值 = 1025) ' 收到主程序的退出通知 输出调试文本 (“主程序正常退出”) 被守护进程ID = 0 判断结束 .子程序 检查主程序状态 .局部变量 进程是否存在, 逻辑型 如果 (被守护进程ID = 0) 则 返回 () 结束 如果 进程是否存在 = 进程是否存在 (被守护进程ID) 如果 (取反 (进程是否存在)) 则 输出调试文本 (“主程序异常退出,正在重新启动...”) 启动主程序 () 结束 如果 .子程序 启动主程序 .局部变量 执行结果, 整数型 .局部变量 启动信息, 启动信息 启动信息.执行文件名 = 取运行目录 () + “\主程序.exe” 启动信息.显示方式 = #普通激活 执行结果 = 运行 (启动信息, 假, 被守护进程ID) 如果 (执行结果 = 0) 则 输出调试文本 (“无法启动主程序”) 结束 如果 ``` ## 实现原理说明 1. 主程序启动时会自动运行守护程序,并发送自己的进程ID给守护程序 2. 守护程序隐藏运行,通过定时器定期检查主程序是否仍在运行 3. 如果主程序异常退出,守护程序会自动重新启动它 4. 主程序正常退出时会发送通知给守护程序 ## 使用说明 1. 将两个程序编译为`主程序.exe`和`守护程序.exe`,放在同一目录下 2. 运行`主程序.exe`,它会自动启动`守护程序.exe` 3. 测试时可以手动结束`主程序.exe`进程,观察守护程序是否会重新启动它 ## 注意事项 1. 守护程序使用了隐藏窗口,在任务管理器中可以看到它的进程 2. 守护程序不能通过常规方式关闭,需要从任务管理器结束进程 3. 两个程序通过Windows消息机制进行通信,确保它们在同一个用户会话中运行 ## 额外需要注意的逻辑点 1. 进程检查间隔不宜过短,避免系统资源浪费,示例中使用5秒间隔 2. 守护程序需要处理主程序多次启动的情况,避免创建多个实例 3. 实际部署时应考虑添加加密通信机制,防止恶意程序冒充主程序发送消息 [2025-04-09 23:18:36 | AI写代码神器 | 1218点数解答]