TF_GetThreadMgr 函数获取先前在调用线程中创建的线程管理器对象的副本。
语法
HRESULT TF_GetThreadMgr(
  [out] ITfThreadMgr **pptim
);
参数
[out] pptim
指向接收线程管理器对象的 ITfThreadMgr 接口指针的指针。 如果在调用线程中未创建任何线程管理器,则这会接收 NULL 。
返回值
| 值 | 含义 | 
|---|---|
| S_OK | 函数成功。 如果未在调用线程中创建线程管理器,则 pptim 将为 NULL。 | 
| E_FAIL | 发生了未指定的错误。 | 
注解
如果未在调用线程中创建线程管理器,则此函数会将 pptim 设置为 NULL 并返回S_OK。 因此,在使用 pptim 之前,有必要验证函数是否成功且 pptim 不是 NULL。
示例
没有可用于定义此函数的导入库,因此必须使用 LoadLibrary 和 GetProcAddress 手动获取指向此函数的指针。 下面的代码示例演示如何完成此操作。
以下示例演示了一个函数,该函数将尝试获取以前创建的线程管理器对象的副本。 如果调用线程中不存在线程管理器对象,则函数将创建一个。
              注意  
错误地使用 LoadLibrary 可能会通过加载错误的 DLL 来损害应用程序的安全性。 有关如何使用不同版本的 Windows 正确加载 DLL 的信息,请参阅 LoadLibrary 文档。
typedef HRESULT (WINAPI *PTF_GETTHREADMGR)(ITfThreadMgr **pptim);
HRESULT GetThreadMgr(ITfThreadMgr **pptm)
{
    HRESULT hr = E_FAIL;
    HMODULE hMSCTF = LoadLibrary(TEXT("msctf.dll"));
    ITfThreadMgr *pThreadMgr = NULL;
    if(hMSCTF == NULL)
    {
        //Error loading module -- fail as securely as possible 
    }
    else
    {
        PTF_GETTHREADMGR pfnGetThreadMgr;
    
        pfnGetThreadMgr = (PTF_GETTHREADMGR)GetProcAddress(hMSCTF, "TF_GetThreadMgr");
        if(pfnGetThreadMgr)
        {
            hr = (*pfnGetThreadMgr)(&pThreadMgr);
        }
        
        FreeLibrary(hMSCTF);
    }
    //If no object could be obtained, try to create one. 
    if(NULL == pThreadMgr)
    {
        //CoInitialize or OleInitialize must already have been called. 
        hr = CoCreateInstance(  CLSID_TF_ThreadMgr, 
                                NULL, 
                                CLSCTX_INPROC_SERVER, 
                                IID_ITfThreadMgr, 
                                (void**)&pThreadMgr);
    }
    *pptm = pThreadMgr;
    return hr;
}
要求
| 要求 | 值 | 
|---|---|
| 最低受支持的客户端 | Windows 2000 Professional [仅限桌面应用] | 
| 最低受支持的服务器 | Windows 2000 Server [仅限桌面应用] | 
| 目标平台 | Windows | 
| 标头 | msctf.h | 
| DLL | Msctf.dll | 
| 可再发行组件 | Windows XP 上的 TSF 1.0Windows 2000 Professional |