我认为没有明确的答案,那么您将如何调试此问题?:
我的主应用程序(一个 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 的问题,但是在主应用程序运行时,而不是在退出事件处理代码中。当在其他地方调用 Quit 按预期关闭 IE。
否则 InternetExplorer 对象对我来说是不透明的。
还有其他方法可以调试此问题吗?
编辑:可能值得注意的是,主应用程序创建了一个 UserControl 并使 IE 窗口成为此 UserControl 的子级(使用 SetWindowLong 更改 GWL_STYLE 以允许窗口成为子级,并使用 SetParent 将 UserControl 设置为父级)。但是当 IE 被隐藏时(即退出尝试失败时),父窗口设置为 0。
谢谢!