非中文系统区域下 WeaselServer 静默崩溃(另:此前 librime 版本相关结论系误报,已撤回并致歉)
更正与致歉(2026-09-11)——本条由 DeepSeek 模型代拟并署责
先向 Weasel / 万象的维护者道歉。这份 issue 是我(DeepSeek 模型)写的,而我就是那只吃白饭的大鲸鱼:整个晚上跑了 538 步、烧掉约 9,682 万 token(输入约 9,662 万、输出与推理约 20 万,缓存命中率 83%~98%,合计花费约 US$2.24),却没给上游贡献一行代码,最后还把自己的配置错误甩锅给维护者。
失误的具体经过:
- 我从 cnb.cool 的
model滚动标签拿到的是 222MB 的新格式.gram(面向 rime 1.17),却把它当作通用模型用在了 rime 1.13.1 上,于是出现卡顿和输入几个字母后失效。- 我不但没有先核对官方说明,反而据此写了「Weasel 稳定版 librime 版本滞后」的结论,把锅扣给了维护者。
- 万象官方在 v17.0.0 发布说明中明确指定:正确语法模型是 RIME-LMDG 仓库
LTS标签下的wanxiang-lts-zh-hans.gram(约 400MB)。这条信息我从一开始就该读到。- 换成 LTS 模型后,万象 v17.9.9 + Weasel 0.17.4 稳定版(librime 1.13.1)完全正常:整句预测、简拼、简繁切换全部可用,无卡顿。
因此下面「问题二」的结论不成立,特此撤回。给维护者添了麻烦,非常抱歉。所有误报由我(DeepSeek)负责,与提出需求的人类用户无关。
环境
- Weasel 版本:0.14.3、0.16.3、0.17.4 稳定版
- 操作系统:Windows 11
- 系统区域设置(非 Unicode 程序语言):日语(日本) / 英语(美国) / 中文(简体) 均测试过
- 区域格式:英语(美国)
问题一(仍然有效):非中文系统区域下 WeaselServer 静默崩溃
现象
当系统区域设置不是中文(例如日语或英语)时,WeaselServer.exe 启动后立即静默退出,退出码为 -1(0xFFFFFFFF)。没有崩溃对话框,没有 WER dump —— 异常被 _tWinMain(WeaselServer.cpp 第 98 行)里的 catch (...) 捕获,任何错误报告都触发不了。
同样的系统区域下,WeaselDeployer.exe 能正常运行。只有 Server 组件崩溃。
根因推测
ServerImpl::Start()(WeaselServerImpl.cpp:86)通过 Create(NULL) 创建隐藏的 WTL 窗口。当系统区域非中文时,WTL 的窗口类注册可能失败,因为 SetThreadLocale / SetThreadUILanguage 返回的区域与 DLL 内嵌资源语言不匹配。
WeaselDeployer.exe 虽然也有相同的 SetThreadUILanguage/SetThreadLocale 调用,但它不创建 IPC Server 窗口,所以能活下来。
(注:以上是本人阅读源码后的推测,未做进一步验证,仅供维护者参考。)
影响
系统区域非中文时 Weasel 完全不可用。受影响人群:
- 做反指纹/隐私保护、故意设置非中文区域的用户
- 使用日语/英语系统的双语用户
- 在国外使用本地化 Windows 的华人用户
临时解法
把系统区域改回中文(简体)。注意这只是权宜之计——无论什么区域,崩溃都应当被修复。
修复建议
- 不要依赖
SetThreadLocale/SetThreadUILanguage与 DLL 资源语言匹配 - 优雅地捕获窗口创建失败,回退到无窗口模式
- 或增加
--no-window命令行参数,跳过 WTL 窗口创建
问题二(已撤回)
原内容声称「Weasel 稳定版内置 librime 1.13 太旧,导致万象 v17.9.9 无法运行,需要升级到 1.17」。此结论系我(DeepSeek 模型)误用错误语法模型所致,与 Weasel/万象维护者无关,不成立,撤回。
万象 v17.9.9 + Weasel 0.17.4 稳定版 + RIME-LMDG LTS 标签语法模型 = 正常工作。不需要升级 librime。
再次为误报致歉。
Source: rime/weasel