Я думаю, что нет однозначного ответа, так как бы вы подошли к устранению этой проблемы?:
Мое основное приложение (плагин MicroStation) запускает IE, используя оболочку COM SHDocVw.InternetExplorer, взаимодействует с ним, скрывает его, когда оно не используется (например, перехватывает, когда пользователь закрывает окно, и устанавливает InternetExplorer.Visible в false).
Когда основное приложение закрывается, плагин закрывает IE, вызывая InternetExplorer.Quit, но процесс iexplore остается запущенным (IE скрыт в момент закрытия основного приложения).
Что я пробовал:
- Вызов System.Runtime.InteropServices.Marshal.FinalReleaseComObject для объекта InternetExplorer после вызова Quit
- Установка ссылки на объект InternetExplorer на нуль после Quit и FinalReleaseComObject
- Проверка того, что родительские управляемые объекты получают GC'd (проверка вызова Finalize) до выхода из основного приложения
- Создание тестового консольного приложения и попытка воспроизвести проблему там. Например. пытается вызвать Quit, когда IE находится в скрытом состоянии. (Я не смог воспроизвести проблему, IE закрывается, как только приложение выходит)
Что также интересно, я не смог воспроизвести проблему вызова Quit в том же основном приложении (плагин MicroStation), но во время работы основного приложения, а не в коде обработки событий выхода. При вызове в другом месте Quit закрывает IE, как и ожидалось.
В противном случае объект InternetExplorer для меня непрозрачен.
Есть ли другие способы устранения этой проблемы?
Редактировать: Возможно, стоит отметить, что основное приложение создает UserControl и делает окно IE дочерним по отношению к этому UserControl (используя SetWindowLong, чтобы изменить GWL_STYLE, чтобы позволить окну быть дочерним, и SetParent установить UserControl в качестве родителя). Но когда IE скрыт (что происходит при неудачной попытке выхода), родительское окно устанавливается на 0.
Спасибо!