使用英语阅读

通过


TF_GetThreadMgr 函数 (msctf.h)

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

示例

没有可用于定义此函数的导入库,因此必须使用 LoadLibraryGetProcAddress 手动获取指向此函数的指针。 下面的代码示例演示如何完成此操作。

以下示例演示了一个函数,该函数将尝试获取以前创建的线程管理器对象的副本。 如果调用线程中不存在线程管理器对象,则函数将创建一个。

注意  

错误地使用 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

另请参阅

GetProcAddress

ITfThreadMgr

LoadLibrary