【问题标题】:vb.net - Problem remaking com object after program has closedvb.net - 程序关闭后重新制作 com 对象的问题
【发布时间】:2011-05-19 00:52:04
【问题描述】:

几天来一直在寻找解决这个问题的方法,但没有运气,所以我决定在这里发帖,希望有人能帮助我。更难的是,我无法在我的计算机上非常一致地复制这个问题。有时我会收到错误,但大多数时候不会。

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

但是,iexplorer 进程并没有结束。然后,当用户尝试再次运行程序时,我们收到此错误“System.Runtime.InteropServices.COMException (0x80004005): Creating an instance of the COM component with CLSID {0002DF01-0000-0000-C000-000000000046} from the IClassFactory failed由于以下错误: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()

【问题讨论】:

    标签: vb.net com activex


    【解决方案1】:

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

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

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

    您可以通过在您的程序中使用 WebBrowser 来做到这一点。

    【讨论】:

    • 感谢您的建议。大多数情况下应用程序不会崩溃,所以我们不会有任何幽灵进程,但当它发生时,我们通常只有 1 个。在代码的开头还有一个函数可以找到隐藏的 ie 对象并尝试对它们运行 oIE.Quit()。这又失败了。我已经考虑过切换网络浏览器,并且可能会进行切换。唯一的问题是执行 javascript 比较困难,我担心如果我切换,我的用户会收到更多错误。
    • Javascript 在 WebBrowser 中运行也一样。
    • 长话短说,当浏览器补充出现问题(如 Acrobat 出现访问冲突异常)时,您自己的进程将死机,因此请记住这一点。这迫使我们删除 IE 的“嵌入”。所有补充都加载到 WebBrowser 中。
    猜你喜欢
    • 2011-07-16
    • 2019-11-11
    • 2010-10-01
    • 2017-09-10
    • 2013-11-28
    • 1970-01-01
    • 2012-01-17
    • 2011-05-29
    • 1970-01-01
    相关资源
    最近更新 更多