Text Services框架无法将全局隔离专区值设置为VT_BSTR

问题描述

我编写了一个用于使用TSF全局隔离专线进行进程间通信的测试应用程序(.exe),并且当变量类型为VT_I4时,以下代码可以正常工作,但是对于VT_BSTR,ITfCompartment :: SetValue返回S_FALSE,而OnChange回调不在文字服务(IME)上触发。

ITfCompartment :: SetValue的S_FALSE甚至没有记录在MSDN上,我想这意味着操作成功了,但没有效果

任何人都可以提出一些有关如何解决此问题的想法吗?谢谢!

ITfThreadMgr *pThreadMgr;
if (Failed(CoCreateInstance(CLSID_TF_ThreadMgr,nullptr,CLSCTX_INPROC_SERVER,IID_ITfThreadMgr,(void **)&pThreadMgr)))
{
    return;
}

if (Failed(pThreadMgr->Activate(&m_tfClientID)))
{
    return;
}

ITfCompartmentMgr *pCompartmentMgr;
if (pThreadMgr->GetGlobalCompartment(&pCompartmentMgr) != S_OK)
{
    return;
}

ITfCompartment *pCompartment;
if (pCompartmentMgr->GetCompartment(TheGlobalCompartmentGUID,&pCompartment) != S_OK)
{
    pCompartment = nullptr;
    pCompartmentMgr->Release();
    return;
}

VARIANT varValue;
varValue.vt = VT_BSTR;
varValue.bstrVal = SysAllocString(L"abc");
//varValue.vt = VT_I4;
//varValue.lVal = 1;

HRESULT hr = pCompartment->SetValue(m_tfClientID,&varValue);
if (hr != S_OK)
{
    OutputDebugString(L"SetValue Failed");
}

pCompartment->Release();
pCompartmentMgr->Release();

解决方法

简短的答案是,您只能在全局隔离专区中存储整数。考虑到TSF全局隔离专区的工作方式(在COM封送处理层下面运行),无法封送字符串或对象。