2008-09-15 10 views
1

私が書いているActiveXコントロールで問題が起こっています - 時には、Internet Explorerがプロセスシャットダウン時にコントロールを適切にアンロードできないように見えることがあります。これにより、コントロールインスタンスのデストラクタが呼び出されなくなります。Internet ExplorerがActiveXコントロールを適切にアンロードできないのはどのような状況ですか?

コントロールはC++で記述され、ATLを使用し、Visual Studio 2005を使用してコンパイルされます。コントロールが埋め込まれているページからユーザーがブラウズすると、コントロールインスタンスのデストラクタが常に呼び出されます。閉まっている。

IEをデバッガの下で実行すると、デバッガが例外やアクセス違反、アサーションの失敗をキャッチしないという珍しいことは何も表示されませんが、問題は残ります。コントロールのブレークポイントを設定できますデストラクタと私はbroswerを閉じるときに打撃を受けることはありません。

さらに、コントロールの複数のインスタンスを埋め込んだ単純なHTMLページを読み込むと、問題は表示されません。この問題は、Webページから動的にタグを挿入するWebアプリケーションからコントロールがインスタンス化されたときにのみ発生します。もちろん、この問題の原因を知らず、この情報が適切かどうかはわかりませんが、データに依存しているので、これはIEの問題かもしれないことを示しているようです。

デバッガの下で簡単なテストケースを実行すると、コントロールのデストラクタにブレークポイントを設定することができ、毎回ヒットします。私はこれがコントロール自体の問題を排除すると信じています(例えば、デストラクタが呼び出されることを防ぐエラー、例えばインターフェイスリークのようなもの)。

私はIE 6でテストしますが、問題はIE 7でも発生することがわかりました。私はIE 8をテストしていません。

私の現在の仮説は、ブラウザがActiveXコントロール上のインターフェイスをリークさせるような動的HTMLコードに何かがあることです。今のところ、私はアプリケーションの外側でこれを再現する良いテストケースを生成することができず、アプリケーションは大きすぎて良いテストケースを作ることができません。

私は、誰かがこの種の動作を引き起こす可能性がある可能性のあるIEのバグに洞察力を提供できることを期待していました。ところで、以下の答えはあまりにも一般的です - 私はこれを引き起こすことが知られている特定の状況を探しています。確かにそこにいる誰かが以前これを見てきました。

答えて

3

オブジェクトの(C++)デストラクタが呼び出されていないCOMでC++の問題をデバッグするには、COMオブジェクトの参照カウントをどのようにインクリメントまたはデクリメントするかに焦点を当てることをお勧めします。おそらく何が起こっているのは、誰かがrefcountを何回もインクリメントしてから、同じ回数だけインクリメントしていないということです。これにより、オブジェクトが解放されなくなります。

静的ページを使用している場合は、ダイナミックHTMLがIEにバグを表示している可能性があります。

IEにバグがある場合、何がバグの原因となっているのか、そして、IEをトリックしてCOMオブジェクトを適切に解放するために何ができるかを理解することです。

+0

ありがとうございます。動的HTMLコードは十分に毛深いので、どのように動作するかは誰にも分かりません。問題を再現するテストケースを作成するのに十分なだけ解明しようとしています。 –

0

もう1つの方法 - DllMain関数にクリーンアップコードを追加します(その関数が存在しない場合は、その関数を追加します)。その後、関係なく、参照カウント(と参照カウントエラー)の、あなたのDLLがアンロードされたときに自分自身をクリーンアップすることができます

BOOL WINAPI DllMain(HINSTANCE, DWORD dwReason, LPVOID) { 
    if (dwReason == DLL_PROCESS_DETACH) { 
     CleanUpAnyObjectsStillAlive(); 
    } 
} 

ああ、警告の言葉 - あなたのクリーンアップを行う時間がかかりすぎていない - あなたの場合私はプロセスのシャットダウンがあなたを殺すことはないと約束することはできません。

+0

MFCで書かれたコントロールではそれを行うことができないことを理解していますか? –

+0

なぜですか?私はMFCのエキスパートではありませんが、MFCのようなライブラリが*あなたが自分のDllMainを提供することを妨げているかどうかはわかりません。 MFCコントロールでそれらをクリーンアップする方法が提供されていないことを意味しますか?ケースが悲しい場合。 – Bruce

+0

または、おそらくMFCがDllMainの独自の実装を提供していて、それにフックすることはできません。それが問題になります。 – Bruce

0

私は同じ問題を抱えていますが、特定のコンピュータでのみ発生します。 このコンピュータには、タブを閉じた後も有効なFlash ActiveXに問題があります。 私の推測では、問題はあなたのコードではないということです。他のコンピュータでその問題がありますか?

+0

私はこれを他のマシンで見たことがあります。 –

関連する問題