vb.net - проблема переделки com объекта после закрытия программы - PullRequest
0 голосов
/ 02 декабря 2010

В течение нескольких дней безуспешно искала решение этой проблемы, поэтому я решила опубликовать здесь и надеяться, что кто-нибудь сможет мне помочь.Что делает это еще сложнее, так это то, что я не могу воспроизвести эту проблему на моем компьютере очень последовательно.Иногда я получаю сообщение об ошибке, но большую часть времени не получаю.

По сути, я создаю объект IE, которым моя программа затем управляет в течение длительного периода времени.Происходит следующее: если пользователь выходит из программы, которую он вызывает oIE.Quit (), то закрывает программу.Это должно закрыть Internet Explorer и все процессы, связанные с ним.

Но процесс iexplorer не заканчивается закрытием.Затем, когда пользователь пытается запустить программу снова, мы получаем эту ошибку «System.Runtime.InteropServices.COMException (0x80004005): создание экземпляра компонента COM с CLSID {0002DF01-0000-0000-C000-000000000046} из IClassFactory завершилось ошибкойиз-за следующей ошибки: 80004005. ".

Чтобы исправить это, мы просто закрываем все открытые процессы iexplorer.exe, и это позволит нам снова создать наш объект ie.Это происходит также в случае сбоя программы, и они пытаются перезапустить ее.

Я не уверен, что является причиной этого, или я пропускаю что-то, что связано с com-объектами.Но я просто застрял.

Вот некоторый код, хотя подключение этого кода, скорее всего, не даст никаких ошибок:

'create ie object
oIE = New SHDocVw.InternetExplorer
oIE.Navigate("http://www.google.com")
oIE.Visible = False
oIE.Silent = True

'kill ie object
oIE.Quit()

1 Ответ

1 голос
/ 02 декабря 2010

Исключение, которое вы получаете, безнадежно, это E_FAIL, "Unspecified error". Нет никаких очевидных причин, по которым это может не получиться, запуск другого экземпляра IE при запуске программы не должен быть проблемой. Ну, если не считать тех призрачных экземпляров IE, которые работают вечно. Я предполагаю, что вы получили это исключение по той же причине, по которой IE не завершал работу, когда вы в последний раз вызывали Quit ().

Подумайте о том, какой несчастный случай вы создадите, когда ваша программа прерывается и не может просто завершить работу IE. Например, использование Environment.Exit () было бы вредно для здоровья. Или любой другой вид противного kaboom, который не позволяет потоку финализатора работать в конце. Может быть, это уже случалось много раз, теперь IE просто отказывается создавать больше экземпляров? Сколько случаев вам нужно убить, когда вам нужно, чтобы все началось снова?

Гораздо лучшая мышеловка здесь - это запускать IE внутри процесса в вашей собственной программе, а не вне процесса с SHDocVw. Так что, когда ваша программа завершает работу, она берет IE с собой. Это также намного эффективнее, так как при выполнении вызовов COM-сервера вне процесса возникает много накладных расходов.

Вы делаете это с помощью WebBrowser в вашей программе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...