feat(tsf): 激活链路诊断日志——COM 入口与线程激活标志 - #114
Conversation
- DllGetClassObject / ClassFactory::CreateInstance 入口日志(GUID 串 + CLSID 匹配结果) - ActivateEx 打印 ITfThreadMgrEx::GetActiveFlags(线程激活标志位) - QueryInterface 未匹配接口(E_NOINTERFACE)时记录被探测的 riid 定位「游戏等特殊宿主中输入法被静默筛除」类问题时,可在 %LOCALAPPDATA%\WindInput[Dev]\logs\tsf_log\ 观察 COM 激活被拒发生在哪一层。
|
All contributors have signed the CLA ✍️ ✅ |
|
I have read the CLA Document and I hereby sign the CLA |
|
recheck |
|
审过了,代码没有问题,可以合。 核对无误的部分
一条不阻塞的建议
仓里为此备了闸门,定义与用法各有注释: if (WindLog::IsEnabled(4)) {
WCHAR szIid[64] = {};
StringFromGUID2(riid, szIid, ARRAYSIZE(szIid));
WIND_LOG_DEBUG_FMT(L"TextService::QueryInterface E_NOINTERFACE riid=%ls", szIid);
}说清楚分量: 一处你没提到的价值
CI当前那次红的与你无关:失败项是 我这就 update-branch 把新 main 并进来重跑( |
背景
「游戏等特殊宿主中输入法被静默筛除」类问题定位困难——TIP 未被激活时连
ActivateEx都不会被调用,现有日志无从下手。本 PR 在四个关键层补充埋点,正是它们把流放之路(国际服)案例中「COM 激活前被筛除」这一层钉死的。改动
DllGetClassObject入口:日志输出 rclsid/riid 与 CLSID 匹配结果(COM 激活第一入口)CClassFactory::CreateInstance入口:日志输出 riid 与聚合参数CTextService::ActivateEx:经ITfThreadMgrEx::GetActiveFlags打印线程激活标志(activeFlags,TF_TMF_* 位),可区分 SECUREMODE/UIELEMENTENABLEDONLY/COMLESS/IMMERSIVE 等约束CTextService::QueryInterface:未匹配接口(E_NOINTERFACE)时记录被探测的 riid用法
tsf_log_config开mode=file level=debug后,在%LOCALAPPDATA%\WindInput[Dev]\logs\tsf_log\按「有无DllGetClassObject日志行」即可判定拒绝发生在 COM 之前(注册面/能力筛选)还是之后(TIP 内部)。已在本机流放之路(国际服)案例中实测:游戏正式会话期间选清风连
DllGetClassObject都无记录,直接证明筛选发生在 COM 激活之前。