image.png

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