1

作成中の ActiveX コントロールで複雑な問題が発生しています。Internet Explorer が、プロセスのシャットダウン時にコントロールを適切にアンロードできないように見えることがあります。これにより、コントロール インスタンスのデストラクタが呼び出されなくなります。

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

デバッガーで IE を実行しても異常は見られません - デバッガーは例外、アクセス違反、またはアサーションの失敗をキャッチしませんが、問題はまだ残っています - コントロールのデストラクタにブレークポイントを設定できますが、決してブラウザを閉じるとヒットします。

さらに、コントロールの複数のインスタンスを埋め込んだ単純な HTML ページをロードしても、問題は見られません。この問題は、Web ページに動的にタグを挿入する Web アプリケーションからコントロールがインスタンス化された場合にのみ発生するようです。しかし、これはデータに依存しているため、IE の問題である可能性があることを示しているようです。

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

私はほとんどのテストを IE 6 で行っていますが、IE 7 でも問題が発生するのを見てきました。IE 8 はテストしていません。

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

この種の動作を引き起こすことが知られている IE のバグの可能性について、誰かが洞察を提供できることを期待していました。ちなみに、以下に示す回答は一般的すぎます。これを引き起こすことが知られている特定の状況を探しています。きっと誰かがこれを前に見たことがあるでしょう。

4

3 に答える 3

3

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

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

IEにバグがある場合、その秘訣は、バグが発生する原因と、IEを騙してCOMオブジェクトを適切に解放する(HTMLを削除するなど)ために何ができるかを理解することです。

于 2008-09-16T03:18:29.513 に答える
0

別のアプローチ - DllMain関数にクリーンアップ コードを追加します (関数がまだ存在しない場合は追加します)。次に、参照カウント (および参照カウント エラー) に関係なく、DLL がアンロードされると、自分自身をクリーンアップできます。

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

ああ、警告の言葉 - クリーンアップにあまり時間をかけないでください - もしそうしても、プロセスのシャットダウンがあなたを殺さないことを約束することはできません.

于 2008-10-03T02:46:57.557 に答える
0

同じ問題がありますが、特定のコンピューターでのみ発生します。このコンピューターには、タブを閉じた後もアクティブなままの Flash ActiveX にも問題があります。私の推測では、問題はあなたのコードにはありません。他のコンピューターでその問題はありますか?

于 2008-12-30T13:03:15.537 に答える