TSF 输入法学习与开发笔记

由于 TSF 输入法的本质是提供两个 dll 文件,所以,我们这里的研究就是围绕着如何写好这个 dll 动态链接库来展开的。

并且,本次的研究主体是微软提供的 Sample TSF 代码。当然,过程中不排除会包括我自己新添加的代码、特性和优化以及修复等等。

注意,这个代码是可以正常编译和运行的。

如果有同样对输入法十分感兴趣的同志有遇到的什么问题,欢迎找到我的联系方式和我进行这方面的交流。

DllMain

DllMain 函数在 dll 被加载和卸载时被调用,它通常用于执行初始化和清理工作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "Private.h"
#include "Globals.h"

//+---------------------------------------------------------------------------
//
// DllMain
//
//----------------------------------------------------------------------------

BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID pvReserved)
{
pvReserved; // 空操作,用于消除某些编译器的警告

switch (dwReason)
{
case DLL_PROCESS_ATTACH: // dll 被加载时执行

Global::dllInstanceHandle = hInstance; // 将 dll 实例句柄存储在全局变量中

// 初始化一个临界区,用于多线程同步
if (!InitializeCriticalSectionAndSpinCount(&Global::CS, 0))
{
return FALSE;
}

// 注册一个窗口类
if (!Global::RegisterWindowClass())
{
return FALSE;
}

break;

case DLL_PROCESS_DETACH: // dll 被卸载时执行,这里主要就是 dll 附着的窗口被关闭时需要执行这里的操作

DeleteCriticalSection(&Global::CS); // 删除之前的临界区

break;

case DLL_THREAD_ATTACH: // 新线程被创建时执行

break;

case DLL_THREAD_DETACH: // 线程退出时执行

break;
}

return TRUE; // dll 加载成功
}

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!