none
TSF UILess ITfUIElementSinkをAdviseSinkできません

    質問

  • Win7 VC++ 2010 Win32プロジェクトにてTSF対応アプリを作成しています。

    ITextStoreACPを実装してエディットコントロールもどきを作成しています。

    現状、 キーボード入力から文字の描画し、表示属性を取得して入力中文字列に対してアンダーラインを引くところまでできています。

    TIPはOffice標準のOffice IME 2010です。

    アプリ作成の参考にしたのはSDK sampleのwinui/tsfappです。

     

    課題はUILess Modeの適用です。

    今はTIPが変換候補一覧ウィンドウ(Candidate Window)を表示していますが、自前で候補ウィンドウを作成したいと思っています。

    そこで下記サイト等を参考にUILessにしたいと思っているのですが、うまく行きません。

    http://msdn.microsoft.com/en-us/library/aa966970.aspx#

    ITextStoreACPを実装したクラスにITfUIElementSinkを実装し、以下のようにAdviseSinkしているのですが

    AdviseSinkがE_FAILEを返してインストールできません。

    以下の処理はWM_CREATEハンドラで行っています。

    // ITfThreadMgrExPtr mThreadMgr;
    //  ←メンバ変数でCoCreateInstance,ActivateEx済み
    
    ITfUIElementMgrPtr aUIMgr;
    HRESULT hr = mThreadMgr->QueryInterface(&aUIMgr);
    if (FAILED(hr)) return;
    
    ITfSourcePtr aSource;
    hr = aUIMgr->QueryInterface(&aSource);
    if (FAILED(hr)) return;
    
    hr = aSource->AdviseSink(IID_ITfUIElementSink, static_cast<ITfUIElementSink *>(this), &mCookie);
    if (FAILED(hr)) return;

    ※ ITf***Ptrは_COM_SMARTPTR_TYPEDEFでtypedefした型です。

    ※ 接頭語の[a]や[m]はそれぞれ[auto]、[member]を意味しています。

     

    どなたかご教示のほど、よろしくお願いいたします。

    2011年3月23日 5:29

回答

  • 流れは正しいです。

    aSource->AdviseSinkを呼ぶと static_cast<ITfUIElementSink *>(this)に対してIUnknown::QueryInterfaceでITfUIElementSinkを問い合せてきます。
    その処理は正しいですか?Errorを返していませんか?

    • 回答としてマーク yield break 2011年3月23日 10:37
    • 回答としてマークされていない yield break 2011年3月23日 10:38
    • 回答としてマーク yield break 2011年3月23日 10:44
    2011年3月23日 8:35

すべての返信

  • 流れは正しいです。

    aSource->AdviseSinkを呼ぶと static_cast<ITfUIElementSink *>(this)に対してIUnknown::QueryInterfaceでITfUIElementSinkを問い合せてきます。
    その処理は正しいですか?Errorを返していませんか?

    • 回答としてマーク yield break 2011年3月23日 10:37
    • 回答としてマークされていない yield break 2011年3月23日 10:38
    • 回答としてマーク yield break 2011年3月23日 10:44
    2011年3月23日 8:35
  • kozzさん、ご返信ありがとうございます。

     

    QueryInterfaceにてITfUIElementSinkへの問い合わせ対応が抜けていました。

    QueryInterfaceを対応したところ、正常にインストールでき、UILessを実現できました。

    確認不足の早合点、大変失礼いたしました。

    誠にありがとうございました。

     

    追記)

    [回答としてのマーク ]をつけたり外したりと見苦しい動作、申し訳ございません。

    このForumにまだ慣れていないもので。。。

    • 回答としてマーク yield break 2011年3月23日 10:41
    • 回答としてマークされていない yield break 2011年3月23日 10:43
    2011年3月23日 10:41