
转自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组件对应的文件地址和线程模型写入到注册表中,效果如下图所示。
注册表地址如下所示:
