トップ回答者
TSF STAとMTAの違いについて

質問
-
お世話になっております。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
回答
-
UIはThread safeではないため、STA一択です。
TSFのThreading ModelはSTAを期待していますので、MTAにしてもPerformanceの向上等の優位性は得られません。また、Applicationの要件次第ですが、Drag&Drop等OLEの機能を利用する場合は、
CoInitializeの代わりにOleInitializeを呼んでください。これもSTAになります。- 回答としてマーク yield break 2011年4月18日 0:30
すべての返信
-
解決策ではありません。
MTA で動かない COM はいろいろとあると思われますが、MTA をあえて採用する理由は何かあるのでしょうか?
(Shell 関連も MTA だとうまく動かなかったように記憶しています)# メインスレッド(UI スレッド)を STA にすれば問題はなくなるかもしれません。
# なぜ、MTA を求めていたかわからないので、この提案が妥当なのか判断しかねました。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。 -
UIはThread safeではないため、STA一択です。
TSFのThreading ModelはSTAを期待していますので、MTAにしてもPerformanceの向上等の優位性は得られません。また、Applicationの要件次第ですが、Drag&Drop等OLEの機能を利用する場合は、
CoInitializeの代わりにOleInitializeを呼んでください。これもSTAになります。- 回答としてマーク yield break 2011年4月18日 0:30