5

明確な答えはないと思うので、この問題のデバッグにどのようにアプローチしますか?:

私のメインアプリ(MicroStationプラグイン)は、SHDocVw.InternetExplorer COMラッパーを使用してIEを起動し、対話し、使用されていない場合は非表示にします(たとえば、ユーザーがウィンドウを閉じてInternetExplorer.Visibleをfalseに設定するとインターセプトします)。

メインアプリが閉じられると、プラグインはInternetExplorer.Quitを呼び出してIEを閉じますが、iexploreプロセスは実行されたままになります(メインアプリが閉じられた時点でIEは非表示になっています)。

私が試したこと:

  • Quitを呼び出した後、InternetExplorerオブジェクトでSystem.Runtime.InteropServices.Marshal.FinalReleaseComObjectを呼び出します。
  • QuitおよびFinalReleaseComObjectの後でInternetExplorerオブジェクトへの参照をnullに設定する
  • メインアプリが終了する前に、親管理対象オブジェクトがGCされていることを確認します(Finalizeが呼び出されているかどうかを確認します)。
  • テストコンソールアプリを作成し、そこで問題を再現しようとしています。たとえば、IEが非表示状態のときにQuitを呼び出そうとします。(問題を再現できませんでした。アプリが終了するとすぐにIEが閉じられます)

また興味深いことに、同じメインアプリ(MicroStationプラグイン)内でQuitを呼び出す際の問題を再現できませんでしたが、メインアプリの実行中は、exitイベント処理コードでは再現できませんでした。他の場所で呼び出されると、Quitは期待どおりにIEを閉じます。

それ以外の場合、InternetExplorerオブジェクトは私には不透明です。

この問題をデバッグする他の方法はありますか?

編集:メインアプリがUserControlを作成し、IEウィンドウをこのUserControlの子にすることに注意してください(SetWindowLongを使用してGWL_STYLEを変更し、ウィンドウを子にし、SetParentを使用してUserControlを親として設定します)。ただし、IEが非表示の場合(Quitの試行が失敗した場合)、親ウィンドウは0に設定されます。

ありがとう!

4

0 に答える 0