ワーカースレッドからのアパートメントスレッドCOMインターフェイスの呼び出し(マーシャリング)のATLサンプル
-
29-10-2019 - |
質問
私はATL COMサーバー DLLでクロススレッドCOM呼び出しを行うことを示すコードサンプルを探しています。一つ知っていますか?
より多くの細部:
私のコンポーネントは、バックグラウンドスレッドで作業を行う必要があるIEブラウザヘルパーオブジェクトです。IEのメインスレッドから呼び出された私のオブジェクトのメソッドの1つで、IEはIE DOMへのポインタを提供します(IHtmlWindow2
)と私はそれをローカルメンバー変数に格納します。
ここで、保存したばかりのCOMインターフェイスポインタのメソッドを非同期で呼び出すことができるワーカースレッドを作成したいと思います。
重要な場合は、IEからインターフェイスポインターを取得したメソッドから戻った後に呼び出しが発生するため、ワーカースレッドから呼び出しを行おうとすると、IE(コードではありません)が制御されます。
私のコンポーネントとホストアプリケーションの両方がスレッド化されています。
誰もがこれがどのように行われるかを示す良いC++サンプルを知っていますか?
私は具体的に短い、簡単なサンプルを探しています(と ない 関連するドキュメントへのポインタだけ)私が読んだので この質問 そして、その答えは、実装を最初から書くために私がしなければならない学習の量に脅かされました。誰かがコードを書く前にドンボックスの本を読むことをお勧めするときはいつでも、あなたは長い間混乱している夜にいることを知っています。..:-)
解決
これはCOMでは自動的に行われ、インターフェイスポインタにSTAアフィニティがある場合は、アパートの要件を処理し、呼び出しをマーシャリスレッドで使用する前にインターフェイスポインタをマーシャリングする必要があります。ATLにはAtlMarshalPtrInProc()およびAtlUnmarshalPtr()ヘルパーメソッドがあり、それを簡単にします。あなたがそれを自分でやりたい場合は、C o m a r s h a l i nterthreadinterfaceinstream()またはIGlobalInterfaceTable。