2009-07-07 4 views
1

USBデバイスとのインターフェイスに.NET ActiveXコントロールを使用しています。コントロールのサプライヤは、デバイスを使用する際にコントロールのShutdown()メソッドを呼び出さなければならないと言います。ページ間で使用され、ユーザーがアプリケーションを離れるときではなく、ページがアンロードされたときしかわからないため、ユーザーがいつコントロールを使用しているかを判断するのが容易ではないため、これは私にとって問題です。IEが閉じるときに.NET ActiveXコントロールによって使用されるリソースをきれいに解放する方法

ブラウザが閉じたときにブラウザがすべてのActiveXコントロールに通知するのではなく、コントロールが使用するリソースのすべてを処理することができないのですか?

答えて

1

短い答えは、「いいえ、ブラウザが去っているときを知る方法がありません」です。

次のように長い答えは:

あなたは、各タブでのBHOを持ち、それぞれのBHOが取得するときに不可分のカウントをインクリメントすることにより開いているタブのグローバル、プロセス全体のカウントを維持することができるIE6とIE7で
  1. DWebBrowserEvents2 :: OnQuitメッセージを受け取ったときにカウントをアトミックにデクリメントします。次に、カウントが1になり、OnQuitメッセージが表示されたら、最後のタブであり、プロセスが終了していることがわかります。
  2. IE8ではプロセス分離の問題があり、何かを試してみることもできますが、すべてのタブが閉じられてもタブホストプロセスは消えません。彼らは新しいタブが開く場合にしばらくの間留まります。

しかし、コントロールが破棄されたとき(つまりページがナビゲートするとき)にクリーンアップしたいからです。私はあなたが「コントロールはページ間で使用されています」という意味をよく理解していません。実際はサポートされていないからです。

あなたのコントロールが去っていくのを知る適切な方法は、IOleObjectを実装することです.IEleObjectを実装するには、IEがIOleObject::SetClientSite(NULL)を呼び出します。 NULLサイトを取得すると、クリーンアップされます。

+0

コントロールは状態を持ち、複数のページで使用されるため、onunloadイベントでShutdown()を呼び出すことはできません。なぜなら、次のページもコントロールを使用しているからです。 – BeWarned

+0

したがって、1ページでActiveXコントロールが作成され、永遠にそのページが貼り付けられますか?それは良いようではありません。サイトは無効になります。 –

+0

コントロールは、別のページに移動するたびにインスタンシエートされ、ステートフルなスキャナとの会話が開始されます。私は、.Netコントロールのシャットダウンは、ブラウザが閉じるときに、代わりにページ間を移動するときにスキャナをシャットダウンしたいと思っています。 – BeWarned

関連する問題