0

我为使用 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();
4

1 回答 1

0

简短的回答是您只能将整数存储在全局隔间中。鉴于 TSF 全局隔间的工作方式(它在 COM 编组层下方运行),无法编组字符串或对象。

于 2020-08-12T06:01:08.233 回答