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。
没有可用于定义此函数的导入库,因此必须使用 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 |