2010-12-02 17 views
0

Gesucht wurde nach einer Lösung für dieses Problem für Tage ohne Glück so dass ich beschlossen, hier zu posten und hoffe, dass jemand mir helfen kann. Was es noch schwieriger macht ist, dass ich dieses Problem nicht sehr konsequent auf meinem Computer reproduzieren kann. Manchmal werde ich den Fehler bekommen, aber die meiste Zeit werde ich nicht.vb.net - Problem Remaking com Objekt nach dem Programm hat

Grundsätzlich, was passiert ist, ich bin ein IE-Objekt erstellen, die mein Programm dann für eine lange Zeit kontrolliert. Wenn ein Benutzer das Programm beendet, ruft er oIE.Quit() auf und schließt das Programm. Dies sollte den Internet Explorer und alle damit verbundenen Prozesse schließen.

Aber der iexplorer Prozess endet nicht zu schließen. Wenn der Benutzer dann versucht, das Programm erneut auszuführen, erhalten wir diesen Fehler "System.Runtime.InteropServices.COMException (0x80004005): Erstellen einer Instanz der COM-Komponente mit CLSID {0002DF01-0000-0000-C000-000000000046} aus der IClassFactory fehlgeschlagen aufgrund des folgenden Fehlers: 80004005. ".

Um dies zu beheben, schließen wir einfach die offenen iexplorer.exe-Prozesse, die geöffnet sind, und es lässt uns unser ie-Objekt erneut erstellen. Dies geschieht auch, wenn das Programm abstürzt und sie versuchen, es neu zu starten.

Ich bin nicht sicher, was das verursacht oder wenn ich etwas vermisse, das mit com-Objekten zu tun hat. Aber ich stecke einfach fest.

Hier ist ein Code, obwohl wahrscheinlich Fehler reproduzieren nicht in diesem Code Aufstecken:

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

'kill ie object 
oIE.Quit() 

Antwort

1

Die Ausnahme Sie ist hoffnungslos erhalten, das ist E_FAIL „Unbekannter Fehler“. Es gibt keinen offensichtlichen Grund, warum dies fehlschlagen würde. Das Starten einer anderen IE-Instanz beim Starten des Programms sollte kein Problem darstellen. Nun, kurz von diesen geisterhaften Instanzen von IE, die für immer weiterlaufen. Ich würde vermuten, dass Sie diese Ausnahme aus dem gleichen Grund haben, dass IE nicht beendet hat, als Sie Quit() das letzte Mal angerufen haben.

Denken Sie über die Art von Missgeschick nach, das Sie erstellen, wenn Ihr Programm abbricht und es nicht schafft, IE sauber herunterzufahren. Die Verwendung von Environment.Exit() wäre beispielsweise ziemlich ungesund. Oder irgendeine andere Art von ekligem Kaboom, bei dem der Finalizer-Thread nicht ablaufen kann. Vielleicht ist das schon oft passiert, jetzt weigert sich IE einfach weitere Instanzen zu erstellen? Wie viele Instanzen musst du töten, wenn du es wieder in Gang bringen musst?

Die viel bessere Mausefalle hier ist, IE in-process in Ihrem eigenen Programm zu laufen anstatt mit SHDocVw außer Prozess. Wenn das Programm beendet wird, dauert es also IE. Es ist auch viel effizienter, es gibt eine Menge Overhead, die bei der Herstellung von Out-of-Process-COM-Serveraufrufen involviert ist.

Sie tun dies, indem Sie WebBrowser in Ihrem Programm verwenden.

+0

Danke für den Rat. Die meiste Zeit wird die Anwendung nicht abstürzen, so dass wir keine Ghost-Prozesse haben werden, aber wenn dies der Fall ist, haben wir normalerweise nur 1. Es gibt auch eine Funktion am Anfang des Codes, die die versteckten ie Objekte findet und versucht Führe oIE.Quit() auf ihnen aus. Dies schlägt erneut fehl. Ich habe in den Wechsel des Webbrowsers geschaut und werde wahrscheinlich den Schalter machen. Das einzige Problem ist, dass es schwieriger ist, JavaScript auszuführen, und ich bin besorgt, dass meine Benutzer mehr Fehler bekommen werden, wenn ich umschalte. – Phil

+0

Javascript läuft genauso gut in einem WebBrowser. –

+0

Ich werde das untersuchen. – Phil