私はIEブラウザヘルパーオブジェクトを持っています。 BHOはCOMオブジェクトとして実装されています。最初は、BHOのライフサイクルはページごとのナビゲーションサイクルにあると考えましたが、実際にはイベントごとのライフサイクルにあるようです。これは、BHOがイベントごとに1回インスタンス化され実行され、1回のナビゲーションにつき多くのイベントが存在することを意味します。私は、BHOのライフサイクルとは別のBHOから呼び出される重要なセクションが必要です。残念ながら、各イベントが独自のCOMサーバーを取得しているように見えるので、静的変数は保持されていないようです。私は、解決策は、IEで起動する別のプロセスを実行することだと考えています(BHOは実行中のインスタンスを確認し、見つかった場合はそれを使用し、それ以外の場合はプロセスを起動します)。クリティカルセクションは二次プロセスの内側にあります。これはこのシナリオを処理する最善の方法でしょうか?Windows COMコンポーネントでクリティカルセクションを設定および管理する方法
答えて
私は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を「期待」しません。それは非ゼロを予期する。
- 1. Windows、Linux、およびメモリ管理
- 2. FOSUserBundleでROLESを追加および管理する方法は?
- 3. NodeJSでワーカープロセスを作成および管理する方法は?
- 4. Windowsエクスプローラの表示設定を取得および設定する方法
- 5. openssl(SSL_get_errorおよびERR_get_error)のエラーキューを管理する方法
- 6. NSMutableStringおよびメモリ管理
- 7. Spring管理MySQL JDBC接続でuseUnicode = trueおよびcharacterEncoding = utf8プロパティを設定する方法
- 8. JavaおよびWindows地域の設定
- 9. com +コンポーネントを呼び出す方法は?
- 10. Rでのメモリ管理、監視、およびテスト方法
- 11. gitでxcodeprojファイルを管理する - ブランチの設定を管理する方法
- 12. webpackでjQueryを設定および使用する方法
- 13. Neo4Jでリストプロパティを設定および更新する方法は?
- 14. laravelでクッキーを設定および取得する方法5.2
- 15. Jenkinsfileで変数を設定および参照する方法
- 16. MariaDBDataSourceを手動で作成および設定する方法
- 17. Windows 7で複数のディスプレイ設定をプログラム的に管理する方法は?
- 18. ココアで簡単なアプリケーションモーダルダイアログを表示および管理する方法
- 19. Office 365でWindowsおよびMac OSの永続キャッシュを管理する方法は?
- 20. ASP.NETアプリケーションでCOMアクセスを管理する方法
- 21. Windows 8およびvs2012を使用するdevのベストバーチャルボックス設定
- 22. C#で管理されていないWin32およびWin64アプリケーションのWindowsメッセージを受け取る方法は?
- 23. Javaおよびメモリ管理のオブジェクトライフサイクル?
- 24. iOSメモリ管理、UIWindow addSubview:およびタブコントローラ
- 25. C++クラス、オブジェクト、およびメモリ管理
- 26. CakePHPのログインおよびセッション管理
- 27. 管理者、ユーザー、およびサブスクライバのデータベーススキーマ
- 28. スパーク - スコープ、データフレーム、およびメモリ管理
- 29. メモリ管理、ヒープ破損、およびC++
- 30. 開発者および管理者の問題管理システム
COMオブジェクトは参照カウントです。存続するためにCOMオブジェクトが必要な場合は、参照カウントを1つ増やします。 – IInspectable
IEが逆参照すると、参照が残ってしまいます。それはIEが別の参照を必要とするときに最後のものがまだ周りにあり、再利用されることを意味しますか? –
AddRefメソッドで1の代わりに2を返すと、IEがAddRefに1の値を期待していて、他の値がエラーとして見なされるため、イベントハンドラへのディスパッチは起こりません。もちろん、私はこれを経験的に証明する方法がありませんが、偶然にもこれは起こっているようです。 –