2016-05-02 8 views
0

私はIEブラウザヘルパーオブジェクトを持っています。 BHOはCOMオブジェクトとして実装されています。最初は、BHOのライフサイクルはページごとのナビゲーションサイクルにあると考えましたが、実際にはイベントごとのライフサイクルにあるようです。これは、BHOがイベントごとに1回インスタンス化され実行され、1回のナビゲーションにつき多くのイベントが存在することを意味します。私は、BHOのライフサイクルとは別のBHOから呼び出される重要なセクションが必要です。残念ながら、各イベントが独自のCOMサーバーを取得しているように見えるので、静的変数は保持されていないようです。私は、解決策は、IEで起動する別のプロセスを実行することだと考えています(BHOは実行中のインスタンスを確認し、見つかった場合はそれを使用し、それ以外の場合はプロセスを起動します)。クリティカルセクションは二次プロセスの内側にあります。これはこのシナリオを処理する最善の方法でしょうか?Windows COMコンポーネントでクリティカルセクションを設定および管理する方法

+0

COMオブジェクトは参照カウントです。存続するためにCOMオブジェクトが必要な場合は、参照カウントを1つ増やします。 – IInspectable

+0

IEが逆参照すると、参照が残ってしまいます。それはIEが別の参照を必要とするときに最後のものがまだ周りにあり、再利用されることを意味しますか? –

+0

AddRefメソッドで1の代わりに2を返すと、IEがAddRefに1の値を期待していて、他の値がエラーとして見なされるため、イベントハンドラへのディスパッチは起こりません。もちろん、私はこれを経験的に証明する方法がありませんが、偶然にもこれは起こっているようです。 –

答えて

0

私はBHOに精通していませんが、私はCOMの観点から何が起こっているのかを教えてくれます。

Internet Explorer(COMクライアント)は、新しいCOMオブジェクトの作成時期を決定します。あなたはそれを支配していません。 IEはイベントごとに1つのオブジェクトを作成します。私は知らないが、私はあなたを信じている。

問題は、オブジェクトのコンストラクタから共有データ(静的なので共有されている)を初期化することです。あなたはそれをすることはできません。これは、ある時点でプロセスごとにオブジェクトのインスタンスが1つしかなければ動作しない可能性があり、COMのルールではそのことを想定できません。 IEがページごとのナビゲーションサイクルごとに同じオブジェクトを使用していたとしても、IEプロセスに複数のページが開いているとどうなりますか?共有データは、オブジェクトの外部で初期化する必要があります。

あなたは、その行為を行う静的メソッドから初期化された静的変数を考えましたか?

また、ATLがサポートするシングルトンパターンもありますが、私はそれをお勧めしません。 IEはおそらく、新しいオブジェクトを要求すると、という新しいオブジェクトを取得し、既存のオブジェクトのコピーは取得しないと想定します。 IEの背後でトリックをしないでください。

正確なメカニズムは、実行しようとしている内容によって異なります。共有データの正確な範囲は何ですか?あなたは多くの詳細を提供していませんが、 "Critical Section"と言っているので、マルチスレッドが関与していて、それがDLLで本当に面倒なことがあります。

私は疑問に思っています。本当に重要なセクションが本当に必要ですか? IEオブジェクトモデルはSingle-Apartment-Threaded(STA)ですが、BHOプロトコルもSTAであると想像します。については心配する必要はありません。自分でスレッドを作成している場合を除きます。

質問の下のコメントの連鎖についてのいくつかの明確化:人工リリース(の戻り値を増やす

)またはのAddRef()が有効ですが、何も変更しません。両方のメソッドが実際の参照カウントを返すのが普通ですが、それはデバッグ目的のための礼儀であり、それに頼ることはできません。少なくとも1つの未解決の参照がある場合、オブジェクトはゼロ以外の値(0以外の値)を返すことのみが要求されます。

自分でAddRef()を呼び出すと、余分な参照を追跡して何らかの理由でそれを取り除く必要があるため、コードの負担が大幅に増えます。また、Internet Explorerがいつどのように新しいオブジェクトを要求するかには何の影響もありません。 Internet Explorerは、オブジェクトに存在する未処理参照の数をInternet Explorerが認識していないか、気にしていないため、前の点から推測できるので、影響はありません。 IE自体がどれくらいのリファレンスを所有しているかだけ気にします。私はあなたがすでにこれを自分で発見したと思います。IEはAddRef()から1または2を「期待」しません。それは非ゼロを予期する。

関連する問題