再確認した結果、 ITfThreadMgr::Activate を呼び出さない限り、ITextStoreACPを実装せずにスレッド マネージャー オブジェクトを作成できるはずです。
したがって、コードは次のようになります。
HRESULT hr = CoInitialize(NULL);
if (SUCCEEDED(hr))
{
ITfThreadMgr* pThreadMgr(NULL);
hr = CoCreateInstance(CLSID_TF_ThreadMgr, NULL, CLSCTX_INPROC_SERVER, IID_ITfThreadMgr, (LPVOID*) &pThreadMgr);
if (SUCCEEDED(hr))
{
ITfSource *pSource;
hr = pThreadMgr->QueryInterface(IID_ITfSource, (LPVOID*)&pSource);
if(SUCCEEDED(hr))
{
hr = pSource->AdviseSink(IID_ITfActiveLanguageProfileNotifySink,
(ITfActiveLanguageProfileNotifySink*)this,
&m_dwCookie);
pSource->Release();
}
}
}
または、 ITfLanguageProfileNotifySinkを使用できます。このインターフェイスは、ItfThreadMgr ではなく、ItfInputProcessorProfilesオブジェクトから駆動されます。ItfLanguageProfileNotifySinkの MSDN ページに設定方法のサンプルがあります。
両方のオブジェクトについて、アプリケーションが終了するまで、ソース オブジェクト (ITfThreadMgr または ITfInputProcessorProfiles) とシンク オブジェクト (実装したもの) を有効にしておく必要があります。
アプリケーションを終了する前に、ITfSource::UnadviseSinkを使用してソース オブジェクトからシンクを削除してから、 (Release を使用して) ソース オブジェクトを解放する必要があります。(ただし、アプリケーションの存続期間中はItfSourceインターフェースを維持する必要はありません。)