==== 根因确认 ==== 你跑探针首行:全局_进程句柄 = -1 → ★ 句柄无效(≤0)。 这证实了之前的判断:是否已组队 / 是否是队长 两个函数都没读内存,直接 返回(假)。 不是偏移错、不是逻辑错,是“句柄没拿到”。 ==== 为什么是 -1 ==== 全局_进程句柄 是程序集/全局变量,易语言默认初值 0。出现 -1 说明: ① 初始化那段(打开进程、赋值句柄)根本没被调用;或 ② 调用了但“打开进程/取句柄”失败,代码显式置 -1 当“未连接”标记。 两种结局一样:句柄 ≤ 0 → 两个判定函数早退返回假。 ==== 解决:连游戏前必须初始化句柄 ==== 下面这段必须在“读任何内存之前”跑一次,把有效句柄填进 全局_进程句柄。 (精易模块风格:进程_名取ID + 内存_打开进程。若你用的是别的模块,函数名可能不同,按你的模块替换即可。) .版本 2 .子程序 初始化进程句柄, 逻辑型, , 连游戏前必须调一次;成功返回真并填好 全局_进程句柄 .局部变量 进程ID, 整数型 进程ID = 进程_名取ID (“YGOnline.exe”) .如果真 (进程ID = 0) 写日志 (自定义时间 () + “未找到 YGOnline.exe,请先启动游戏” + #换行符) 全局_进程句柄 = -1 返回 (假) .如果真结束 全局_进程句柄 = 内存_打开进程 (进程ID) .如果真 (全局_进程句柄 ≤ 0) 写日志 (自定义时间 () + “打开进程失败,句柄=” + 到文本 (全局_进程句柄) + “(检查:①编译为32位 ②管理员运行 ③XIGNCODE是否放行)” + #换行符) 返回 (假) .如果真结束 写日志 (自定义时间 () + “进程句柄已就绪=” + 到文本 (全局_进程句柄) + “ PID=” + 到文本 (进程ID) + #换行符) 返回 (真) ==== 调用位置(二选一)==== ① 一次性:启动窗口_创建完毕 第一行调 初始化进程句柄 (),进游戏后手动跑一次即可。 ② 容错型(推荐挂机用):挂机主循环/时钟里每周期判断 .如果真 (全局_进程句柄 ≤ 0) 初始化进程句柄 () .如果真结束 这样游戏重启、PID 变了会自动重连,不会再卡在 -1。 ==== 关键排查(初始化后仍失败)==== 若 内存_打开进程 也返回 ≤0,基本是 XIGNCODE 在挡“非 CE 进程”,按优先级排查: 1. 易语言必须编译为 32 位(64 位程序被反外挂一律读不了 YGOnline.exe,见环境坑17)。 2. 以管理员身份运行你的 exe。 3. 确认 YGOnline.exe 确实在运行(任务管理器能看到)。 4. 若以上都做了仍失败 → 你的“易语言直接读内存”方式本身被 XIGNCODE 拒 (STATUS_ACCESS_DENIED)。此时应改用 CE 桥(32位CE + ce_mcp_bridge.lua)读, 原 内存_读整数型(全局_进程句柄, 地址) 这套写法要整体换成桥的 readInteger, 且桥必须挂在 32 位 CE(D:\登录源码数据存储账号\CE+调试V7.6\csrss.exe)。 ==== 连带影响 ==== 自动处理组队 / 遍历队员 / 取队伍人数 等所有 内存_读整数型(全局_进程句柄, …) 调用, 都会因 -1 而读不到数据。把句柄初始化接好,这整条链路一起好。