none
TSF STAとMTAの違いについて RRS feed

  • 質問

  • お世話になっております。TSFを用いてテキストボックス擬きを作成しています。

    現状、一通り実装が終わり(問題は多々ありますが)、テキストボックス擬きをサンプルアプリから本アプリへ移すところで問題が発生しました。

    COMの初期化方法でCoCreateInstance、及び、QueryInterfaceの挙動が変わってしまいました。

    サンプルアプリではCoInitialize(NULL);で初期化していましたが

    本アプリではCoInitializeEx(NULL, COINIT_MULTITHREADED);で初期化しています。

    この結果としてITfCategoryMgr、ITfDisplayAttributeMgrのCoCreateInstanceがE_NOINTERFACEを返し

    ITfUIElementMgrのQueryInterfaceもE_NOINTERFACEを返すようになり

    また、テキストサービスから入力を受けなくなってしまいました。

    →フォーカスを合わせてキーボード入力してもSetSelectionやSetText等のITextStoreACPメソッドが呼ばれなくなりました。

     

    STAとMTAの違いなのでしょうが、具体的な解決策がわかりません。

    どなたかご教示願えませんでしょうか? よろしくお願いいたします。

    環境:Win7 VC++ 2005

    2011年4月12日 7:16

回答

  • UIはThread safeではないため、STA一択です。
    TSFのThreading ModelはSTAを期待していますので、MTAにしてもPerformanceの向上等の優位性は得られません。

    また、Applicationの要件次第ですが、Drag&Drop等OLEの機能を利用する場合は、
    CoInitializeの代わりにOleInitializeを呼んでください。これもSTAになります。

    • 回答としてマーク yield break 2011年4月18日 0:30
    2011年4月13日 9:35

すべての返信

  • 解決策ではありません。

    MTA で動かない COM はいろいろとあると思われますが、MTA をあえて採用する理由は何かあるのでしょうか?
    (Shell 関連も MTA だとうまく動かなかったように記憶しています)

    # メインスレッド(UI スレッド)を STA にすれば問題はなくなるかもしれません。
    # なぜ、MTA を求めていたかわからないので、この提案が妥当なのか判断しかねました。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年4月12日 14:15
    モデレータ
  • >具体的な解決策がわかりません。

    TSF が MTA に対応していないなら、対策はありません。

    TSF の仕様は知りませんが、ざっくりいって、UI に絡むところはおおむね STA である必要があります。

    >本アプリではCoInitializeEx(NULL, COINIT_MULTITHREADED);で初期化しています。

    アプリケーションを STA で動作させるわけにはいかないのでしょうか?

    2011年4月13日 0:44
  • UIはThread safeではないため、STA一択です。
    TSFのThreading ModelはSTAを期待していますので、MTAにしてもPerformanceの向上等の優位性は得られません。

    また、Applicationの要件次第ですが、Drag&Drop等OLEの機能を利用する場合は、
    CoInitializeの代わりにOleInitializeを呼んでください。これもSTAになります。

    • 回答としてマーク yield break 2011年4月18日 0:30
    2011年4月13日 9:35
  • 回答ありがとうございます。

    >MTA をあえて採用する理由は何かあるのでしょうか?

    本アプリは私が作成したわけではないのですが、作成者に問い合わせたところ、WinCE対応の為だそうです。

    TSFはWin32でのみ有効にするつもりですので、 Win32ならSTAで初期化するようにします。

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

    2011年4月18日 0:27
  • 回答ありがとうございます。

    >アプリケーションを STA で動作させるわけにはいかないのでしょうか?

    Win32の場合、STAで初期化するようにします。

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

    2011年4月18日 0:28
  • 回答ありがとうございます。

    >TSFのThreading ModelはSTAを期待しています

    そのようですね。Win32の場合、STAで初期化することで解決としたいと思います。

    ありがとうございました。
    2011年4月18日 0:30