1

Internet Explorer8で実行されるC++で記述されたActiveXコントロールがあります。ほとんどの場合(約90%)、コントロールを含むタブまたはブラウザーを閉じると、次のようなアクセス違反が発生します。

The thread 'Win32 Thread' (0x1bf0) has exited with code 0 (0x0).
Unhandled exception at 0x77b3b9fd in iexplore.exe: 0xC0000005: Access violation reading location 0x65007408.

アクセス違反は、OnDestroy()の呼び出し後、コントロールのデストラクタの呼び出しの前に発生します。

デバッグ出力には次のように表示されます。

No symbols are loaded for any call stack frame. The source code cannot be displayed.

実行中のある初期の時点でヒープが破損した可能性がありますが、私のコードはスタックトレースに存在しません。

OnDestroy()の呼び出しとコントロールのデストラクタの間にActiveXコントロールが受け取るライフサイクルイベントは何ですか?

4

1 に答える 1

1

私が理解しているように、ActiveXには厳密にイベントのライフサイクルはなく、ホスト側によって異なります。たとえば、コントロールがAJAXフレームワークで使用されている場合、OnDestroy()は、デストラクタを呼び出さずにOnCreate()を呼び出すことができます。したがって、OnDestroy()ハンドラー内に初期化解除アクションがないことを確認してください。

ActiveXコントロールテストコンテナにコントロールをロードして、アクティブ化/非アクティブ化で遊ぶことができます。おそらくそれが役立つでしょう。

WindowsのデバッグツールからApplicationVerifierを有効にし、デバッガーがOSデバッグシンボルをダウンロードすることを確認します。この場合、スタックトレースはより有益です。

于 2010-03-31T03:41:21.240 に答える