根因:start_gmweb() 用 sys.executable 拉起 gmweb/serve.py,源码运行时是 python.exe,PyInstaller 单文件打包后却是启动器自身 —— 于是 `exe serve.py` 又开了一个启动器,新启动器再去拉 serve.py,每代顺延一个端口并各开一个 空窗口,直到 19546 端口用尽。开发机因为 18112 早被占用走了 early return, 所以看不出来。 - 新增多调用模式 run_script_instead():exe <xxx.py> [args] 时用 runpy 直接 执行该脚本,不开窗口/不提权/不占互斥量,打包后拉起 serve.py 才合法 - 新增单实例互斥(Local\DNF90Launcher-5E9C1B7A):重复启动把已有窗口 ShowWindow+SetForegroundWindow 后退出,不再开第二个窗口 - start_gmweb() 增加就绪校验:spawn 后最多等 6 秒确认 18112 在监听,未监听 则改用 importlib 在本进程线程里跑 serve.py 的 main(),绝不再拉起新窗口 - self_elevate() 提权重启带上原始参数(原来 ShellExecuteW 传 None,参数全丢); DNF90_GMWEB_CHILD=1 的子进程不再触发 UAC - WebView2 数据目录固定到 %LOCALAPPDATA%\DNF90Launcher\WebView2 且 private_mode=False,避免 exe 在只读目录/网络盘时窗口空白且无报错; 启动前查注册表确认运行时是否存在 - 新增 启动器日志.txt(exe 同目录,512KB 转 .old.txt):console=False 下 print 与未捕获异常全部落盘,顶部记录 pid/argv/SERVER_ROOT - 文档:新增 docs/启动器窗口风暴排查.md(现象、根因、复现手法、修复点、 日志判读表),README 常见坑与文档索引、docs/README、launcher/README 同步
29 lines
1.8 KiB
Markdown
29 lines
1.8 KiB
Markdown
# 开发文档索引
|
||
|
||
本目录汇总各子项目的开发文档。
|
||
|
||
| 文档 | 内容 |
|
||
|------|------|
|
||
| [开发文档.md](开发文档.md) | **GM 启动器 / 整合工具** 完整开发文档(环境搭建、架构、API 契约、打包部署、常见问题) |
|
||
| [服务端开发文档.md](服务端开发文档.md) | **服务端(Go)** 架构、GM 接口契约、拍卖行/背包改动、编译部署 |
|
||
| [PVF解析开发文档.md](PVF解析开发文档.md) | **PVF 解析** 套件(pvfine)、pvfexport 工具、离线名称显示集成 |
|
||
| [客户端补丁与CRC校验.md](客户端补丁与CRC校验.md) | **客户端补丁(90CN.dll)** 自校验机制、`patch_dll_crc.py` 用法、与「服务端 DLL 指纹」的区别、排查手册 |
|
||
| [启动器窗口风暴排查.md](启动器窗口风暴排查.md) | **启动器重复开窗口 / 页面空白** 的根因(打包后 `sys.executable` 指向自身)、复现手法、修复点与日志判读 |
|
||
| [launcher-README.md](launcher-README.md) | 整合启动器 + GM 工具的原始 README |
|
||
|
||
其余子项目的 README 分散在各自目录:
|
||
|
||
- `server/README.md` — 服务端源码说明
|
||
- `pvf/README.md` — pvfine 项目说明
|
||
- `gmtool/README.md` — GM 工具旧版说明
|
||
|
||
---
|
||
|
||
## 快速上手路径
|
||
|
||
1. **只想跑起来**:看根目录 [README](../README.md) 的「快速开始」。
|
||
2. **改 GM 工具(启动器)**:看 [开发文档.md](开发文档.md)。
|
||
3. **改服务端 GM 接口**:看 [服务端开发文档.md](服务端开发文档.md) 的「GM 接口契约」。
|
||
4. **改 PVF 解析 / 物品名**:看 [PVF解析开发文档.md](PVF解析开发文档.md)。
|
||
5. **改客户端补丁 / 重编 DLL**:看 [客户端补丁与CRC校验.md](客户端补丁与CRC校验.md)——改完 DLL 要补 CRC,并且要重编服务端。
|