vb.net - 程序关闭后重新构建com对象的问题

时间:2010-12-02 10:05:29

标签: vb.net com activex

在没有运气的情况下一直在寻找这个问题的解决方案所以我决定在这里发帖并希望有人可以帮助我。更难的是,我不能非常一致地在我的计算机上复制这个问题。有时我会得到错误,但大部分时间我都不会。

基本上发生的事情是我正在创建一个IE对象,然后我的程序会控制很长一段时间。发生的事情是,如果用户退出程序,则调用oIE.Quit()然后关闭程序。这应该关闭Internet Explorer以及与之关联的所有进程。

但是,iexplorer流程并没有最终结束。然后,当用户再次尝试运行该程序时,我们收到此错误“System.Runtime.InteropServices.COMException(0x80004005):从IClassFactory创建具有CLSID {0002DF01-0000-0000-C000-000000000046}的COM组件的实例失败由于以下错误: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 个答案:

答案 0 :(得分:1)

你得到的例外是没有希望的,那就是E_FAIL,“未指明的错误”。没有任何明显的原因导致失败,当你的程序启动备份时启动另一个IE实例应该不是问题。好吧,从那些永远运行的IE的鬼实例中缩短。我猜你有这个异常的原因与最后一次调用Quit()时IE没有退出的原因相同。

请考虑当您的程序中止并且无法彻底关闭IE时,您将创建的那种不幸事件。例如,使用Environment.Exit()会非常不健康。或任何其他令人讨厌的kaboom,它不会让终结器线程在终止时运行。也许这已经发生了很多次,现在IE只是拒绝创建更多的实例?当你需要再次杀死它时,你需要杀死多少个实例?

这里更好的捕鼠器是在您自己的程序中运行IE进程,而不是使用SHDocVw进行进程外处理。因此,当您的程序终止时,它需要IE。它的效率也更高,进行进程外COM服务器调用会产生大量开销。

您可以在程序中使用WebBrowser来完成此操作。