Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
vb.net-程序关闭后重新生成com对象时出现问题_Vb.net_Com_Activex - Fatal编程技术网

vb.net-程序关闭后重新生成com对象时出现问题

vb.net-程序关闭后重新生成com对象时出现问题,vb.net,com,activex,Vb.net,Com,Activex,几天来我一直在寻找解决这个问题的方法,但运气不佳,所以我决定在这里发帖子,希望有人能帮助我。更困难的是,我无法在我的计算机上非常一致地复制这个问题。有时我会出错,但大多数时候我不会 基本上,我正在创建一个IE对象,然后由我的程序控制很长一段时间。发生的情况是,如果用户退出调用oIE.Quit()的程序,然后关闭该程序。这将关闭internet explorer及其所有相关进程 但是,iexplorer进程并没有结束。然后,当用户再次尝试运行该程序时,我们会收到以下错误“System.Runtim

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

基本上,我正在创建一个IE对象,然后由我的程序控制很长一段时间。发生的情况是,如果用户退出调用oIE.Quit()的程序,然后关闭该程序。这将关闭internet explorer及其所有相关进程

但是,iexplorer进程并没有结束。然后,当用户再次尝试运行该程序时,我们会收到以下错误“System.Runtime.InteropServices.COMException(0x80004005):从IClassFactory创建CLSID为{0002DF01-0000-0000-C000-0000000000 46}的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()

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

请考虑当你的程序中止时,你会创建的一种错误,并且无法绕过IE。使用Engest.Ext()将是非常不健康的。或者任何其他不允许终结器线程在终止时运行的讨厌的kaboom。也许以前已经发生过很多次了,现在(只是拒绝创建更多的实例)?当你需要重新启动时,你需要杀死多少个实例

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


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

谢谢您的建议。大多数情况下,应用程序不会崩溃,因此我们不会有任何重影进程,但当它崩溃时,我们通常只有1个。代码开头还有一个函数,用于查找隐藏的ie对象并尝试对其运行oIE.Quit()。这又失败了。我已经研究过如何切换webbrowser,很可能会进行切换。唯一的问题是,执行javascript更难,我担心如果我切换,我的用户会收到更多错误。javascript在WebBrowser中运行得也一样好。长话短说,当浏览器补码中出现问题时(如Acrobat出现访问冲突异常),您自己的进程将死亡,所以请记住这一点。这迫使我们删除IE的“嵌入”。所有补码都加载到WebBrowser中。