文本服务框架无法将全局隔离区值设置为 VT_BSTR

Text Services Framework failed to set global compartment value as VT_BSTR

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

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 封送处理层下运行),封送字符串或对象是不可能的。