fix(tsf): ThreadingModel 改回 Apartment(对齐 TSF 标准),类别 GUID 数值防御性修正 - #116
Conversation
游戏聊天框等 GIP 上下文(Win11 输入栈)激活 in-proc TSF IME 前,
msctf 按 ThreadingModel 与能力类别筛选,任一不满足即被静默筛除。
- Register.cpp:ThreadingModel 由 Both 改回 Apartment(TSF 标准;
Both 系历史上为「Win11 现代应用兼容」引入,实测恰是 GIP 上下文
激活失败的元凶之一)
- Register.cpp:修正两个类别 GUID 手抄错误(迁移期引入)——
UIELEMENTENABLED/SECUREMODE 曾注册到系统不识别的假 GUID 上;
改为 SDK 真值({49D2F9CF-...}/{49D2F9CE-...}),并在注册时对
假值 UnregisterCategory 自愈清理历史脏项
(从 huanfeng#113 按作者建议拆分,仅含 Register.cpp 部分)
Win11 输入栈(GIP 路径,游戏聊天框等上下文)对 in-proc TSF IME 存在 未文档化的位置约束:InprocServer32 指向系统目录副本时可激活,指向 安装目录时被静默筛除(真机 A/B 实验证据见 huanfeng#115)。对齐 weasel 安装 模式与 wind-installer 修复版(huanfeng/wind-installer#1)。 (从 huanfeng#113 按作者建议拆分;ThreadingModel/GUID 修正已拆至 huanfeng#116)
|
感谢拆分。逐条核过之后有几个问题需要先澄清,主要集中在因果归因上——改动方向大体没问题,但描述里的因果链有一环不成立。 一、GUID 部分是空操作:手抄错值从未进过链接产物,也从未写进注册表
在未打本 PR 的 main( MinGW 时代同样不成立:已删除的垫片 所以:
把数值改成 SDK 真值本身值得保留——万一将来某个 TU 引入 另外 二、真机验证存在混淆变量,目前无法归因到本 PR本 PR 从 #113 拆出,而 #113 做的是把 DLL 复制进 System32/SysWOW64 再对系统副本 regsvr32,它给出的理由正是同一句「GIP 路径只激活位于系统目录的 in-proc TSF IME DLL,安装目录副本会被 msctf 在 COM 激活前静默筛除」。 两个 PR 各自声称是同一症状的原因,而 LOL 真机验证很可能是在两者都生效的环境下做的。要把功劳归给 #116,需要一次 A/B:
一个可以缩小搜索空间的事实:#113 里的 三、
|
| 部分 | 处置 |
|---|---|
ThreadingModel → Apartment |
可合并(注释措辞降级 + 补 UWP / 开始菜单真机) |
| GUID 数值修正 | 保留,但重写为「防御性修正」而非「修复」 |
| typo 自愈循环 | 删除(死代码,清理从未存在的表项) |
| PR 描述的因果叙述 | 需重写,否则会在仓库里沉淀一条错误的「已定论」 |
| 真机归因 | 需 A/B 复测,当前证据无法区分 #116 与 #113 |
顺带一提,Register.cpp:202-206、256-260 的 #ifndef __MINGW32__ 已是死分支(mingw_tsf_compat.h 全仓不存在),可以另开一个 PR 清理,不必混进这个。
- GUID 注释区重写:明确 DEFINE_GUID 声明语义(值由 uuid.lib 提供), 数值改真值属防御性修正(防未来引入 initguid.h 时错值生效), 删除「曾注册假 GUID」的不实叙述 - 删除 typo 自愈 UnregisterCategory 循环(清理从未存在的表项,死代码) - ThreadingModel 注释降级:对齐 weasel / SampleIME 的 TSF 标准做法, 去除「msctf 静默筛除非 Apartment」的因果表述
|
感谢细致的 review,全部接受并已按处置表修订(
PR 描述已同步重写。#115 已发勘误评论修正「假 GUID」错误因果。 |
|
复核
净 diff 收敛到 1 文件 +14/-6,很干净。 关于 A/B 归因E1 / E3 / E2 的三格设计是成立的(缺的第四格「安装目录 + Both」即修复前原状,已知不可用),接受这个结论:本 PR 与系统目录部署是 AND 关系。 一个流程上的建议:这三组实验目前只存在于 #115 的勘误评论里的一句转述,issue 正文那张表仍是「修复模式」的整体口径,没有单变量分解。麻烦把 E1/E2/E3 补成一张表落到 #115 正文——它现在是支撑本 PR 必要性的唯一证据,埋在评论里过几个月就找不回来了。 另外补一条不依赖游戏场景归因也成立的支撑:#115 里你做的冰凌注册面取证显示它的 CI 说明当前 head 的 CI 处于 另外提醒一下:上一轮真正跑过的那次 CI 失败( 后续代码侧我这边通过,等 CI 跑绿即可合。需要说明的是:按 E1,本 PR 单独并不能修好游戏场景——实际生效仍取决于系统目录部署那条线(#113 剩余部分 / wind-installer#1)的决定。那部分我们在 #115 继续讨论,不阻塞这个 PR。 感谢你在这轮里把因果叙述改对、还主动去 #115 发了勘误——这比修一个 bug 更有价值。 |
|
补一条不依赖游戏场景归因的直接证据:把我这台机器上所有已注册的 TSF 输入法的
(另:微软拼音 本机 17 个 in-proc TSF 组件里,清风的两份是唯二用 这条证据的好处是它与游戏、与 GIP、与 E1/E3 都无关:改回 顺带印证了 #115 里的两个取证:weasel 确实在 |
内容(按 review 修订)
ThreadingModel:Both → Apartment——对齐 TSF 标准做法(weasel / SampleIME 同为 Apartment)。历史上的 Both 系 Go 时代为「Win11 现代应用兼容」引入的 workaround 带入,原始症状已失传。本机实测当前注册的 Both(x64 与 WOW6432Node 两份)改为 Apartment 后实打实生效。
类别 GUID 数值修正(防御性):UIELEMENTENABLED / SECUREMODE 的手抄数值对照 msctf.h 改为 SDK 真值。
DEFINE_GUID未定义 INITGUID 时只是声明、实际取值由 uuid.lib 提供,手写数值从未进过链接产物——本修正属防御性质:避免将来某个 TU 引入 initguid.h 后错值突然生效。验证
dev.ps1 dm1构建通过(x64+x86)关联:#113、#114、#115