转自https://blog.csdn.net/yang1fei2/article/details/118977318
TSF 即文本服务框架的英文缩写
微软官方文档(文本服务框架) https://learn.microsoft.com/zh-cn/windows/win32/tsf/text-services-framework
输入法注册
基于TSF框架的输入法其实本质上就是一个COM程序,通过regsvr32.exe进行注册,注册的命令如下所示.
regsvr32.exe sogou.ime //注册输入法 regsvr32.exe /u sogou.ime //取消注册输入法
1.调用对应的注册回调函数
这里解析一下输入法COM程序的注册流程。在注册输入法的时候,会调用对应的输入法动态库里面的DllRegisterServer()函数,在卸载输入法的时候会调用 DllUnregisterServer()
所以输入法动态库需要导出对应的接口函数
//通过RAII方式初始化 class AutoCOM { public: BOOL bInit; //初始化Com对应的库 AutoCOM() { bInit = FALSE; HRESULT hr = CoInitialize(NULL); if (FAILED(hr)) return; bInit = TRUE; } //卸载对应的Com库 ~AutoCOM() { if (bInit) CoUninitialize(); } }; //Com组件注册的时候会被调用 STDAPI DllRegisterServer(void) { AutoCOM ac; if ((!RegisterTSFServer()) //注册表里面注册输入法的信息,注册之后才能调用 || (!RegisterProfiles()) || (!RegisterCategories())) { DllUnregisterServer(); return E_FAIL; } InstallLayout(); return S_OK; } //Com组件被卸载的时候调用 STDAPI DllUnregisterServer(void) { AutoCOM ac; UnregisterProfiles(); UnregisterCategories(); UnregisterTSFServer(); UninstallLayout(); return S_OK; }
2.注册输入法组件的服务端
RegisterTSFServer()注册输入法的时候,会将对应的输入法的CLSID值,输入法的名称以及输入法Com组件对应的文件地址和线程模型写入到注册表中,效果如下图所示。
注册表地址如下所示: