他のスレッドでイベントを受信するBHO(IEの拡張機能)を実行しています。他のスレッドからDOMにアクセスすると、IEがクラッシュします。クラッシュしないように、メインのBHOスレッドと同じスレッドからDOMにアクセスさせることは可能ですか?
一般的なCOMマルチスレッドの問題のようですが、私はあまり理解していません。
他のスレッドでイベントを受信するBHO(IEの拡張機能)を実行しています。他のスレッドからDOMにアクセスすると、IEがクラッシュします。クラッシュしないように、メインのBHOスレッドと同じスレッドからDOMにアクセスさせることは可能ですか?
一般的なCOMマルチスレッドの問題のようですが、私はあまり理解していません。
CoMarshalInterfaceまたはCoMarshalInterThreadInterfaceInStreamの使用を検討してください
これらは、スレッド セーフな STA COM オブジェクトへのラップされたインターフェイスを提供します。
IE 拡張機能についてはよくわかりませんが、COM ランタイム システムが最初に呼び出したスレッドと同じスレッドで確実に実行されるように、一部の COM オブジェクトをシングル スレッド アパートメントとしてマークする必要があるようです。他のオブジェクトを変更できない場合は、STA としてマークされた別の COM オブジェクトを介して DOM への呼び出しをルーティングし、同じ効果を得ることができます。これが役に立てば幸いです... COM マルチスレッドについては少し知っていますが、IE 拡張機能についてはあまり知りません。
ああ、楽しい、楽しい、楽しい、COM でのマルチスレッド化。
インターフェイスポインタをあるスレッドから別のスレッドに一度だけ転送したい場合、ジェラルドの答えは正しいように見えます。マルチスレッドシステムを使用している場合、GIT(グローバルインターフェイステーブル)がこの種のことの大きな助けになることがわかりました...基本的に、インターフェイスポインターを保持するのではなく、GITが使用するDWORDクッキーを保持します使用しているスレッドの適切にマーシャリングされたインターフェイス ポインターを取得します。(最初に問題のオブジェクトを GIT に登録し、後で完了またはオブジェクトが終了したときに登録を解除する必要があります)
ただし、注意してください。パフォーマンスが深刻な問題になる可能性があります。
BHO について学ぶために遊んでいるだけの場合は、STA を使用して ::SetSite() 実装オブジェクトをシングル スレッドのように動作させることができます (これにより、他のスレッドが BHO のポインターを GlobalInterfaceTable から引き出すことができます)。 @JasonSが言及しているように。
製品の一部として期待されることを行っている場合は、可能な限り MTA を使用し、同時実行性とスレッド セーフの問題を自分で処理することを慎重に再検討することを強くお勧めします。この場合、BHO COM オブジェクトと相互運用するスレッド自体が COM 用に初期化されていることを確認するだけで済みます。
たとえば、何か (危険または機密) を探している Web サイトの受信/送信データを監視する場合、これらのスレッドのすべてを STA オブジェクトのスロートに強制する必要はありません。例として Yahoo を使用すると、 30 を超えるリクエストが開始され、BHO が IE をロックし始めます。