海康MV_CC_SetIntValue报错全解析:7个高频错误码根因与防坑实践
2026/10/2 7:30:42
import pymem import pymem.process import tkinter as tk from tkinter import ttk, messagebox import psutil # 帝国时代2征服者 静态基址(相对于模块基址的偏移) BASE_OFFSET = 0x295794 OFFSETS = [0xFC, 0xA8] RESOURCES = { "食物": 0x0, "木材": 0x4, "石头": 0x8, "黄金": 0xC, } class AoE2Trainer: def __init__(self, root): self.root = root self.root.title("帝国时代2-征服者1.0c-资源修改器 (静态地址)") self.root.geometry("400x340") self.pm = None self.module_base = None self.entries = {} self.setup_ui() self.detect_game() def setup_ui(self): ttk.Label(self.root, text="帝国时代2征服者 资源修改器", font=("SimHei", 14, "bold")).pack(pady=10) self.proc_var = tk.StringVar(value="未连接") ttk.Label(self.root, textvariable=self.proc_var).pack() ttk.Button(self.root, text="刷新检测", command=self.detect_game).pack(pady=5) frame = ttk.Frame(self.root) frame.pack(pady=10) for name in RESOURCES: ttk.Label(frame, text=name, width=6).grid(row=list(RESOURCES).index(name), column=0, padx=5, pady=3) e = ttk.Entry(frame, width=12) e.insert(0, "99999") e.grid(row=list(RESOURCES).index(name), column=1, padx=5, pady=3) self.entries[name] = e ttk.Button(frame, text="写入", command=lambda n=name: self.write(n)).grid( row=list(RESOURCES).index(name), column=2, padx=5, pady=3) ttk.Button(self.root, text="全部写入", command=self.write_all).pack(pady=10) def detect_game(self): for p in psutil.process_iter(['name', 'pid']): if 'age2_x1.exe' in (p.info['name'] or '').lower(): self.pm = pymem.Pymem(p.info['pid']) module = pymem.process.module_from_name(self.pm.process_handle, "age2_x1.exe") self.module_base = module.lpBaseOfDll self.proc_var.set(f"已连接: {p.info['name']} (基址: 0x{self.module_base:X})") return self.proc_var.set("未找到 age2_x1.exe") def get_resource_addr(self, offset): # 解析多级指针链 addr = self.pm.read_int(self.module_base + BASE_OFFSET) for off in OFFSETS: addr = self.pm.read_int(addr + off) return addr + offset def write(self, name): if not self.pm: return try: addr = self.get_resource_addr(RESOURCES[name]) val = float(self.entries[name].get()) self.pm.write_float(addr, val) except Exception as e: messagebox.showerror("错误", str(e)) def write_all(self): for name in RESOURCES: self.write(name) messagebox.showinfo("完成", "全部资源已写入") if __name__ == "__main__": root = tk.Tk() AoE2Trainer(root) root.mainloop()