2010-12-02 32 views
0

Je cherchais une solution à ce problème depuis des jours sans succès, j'ai donc décidé de poster ici et j'espère que quelqu'un pourra m'aider. Ce qui le rend encore plus difficile, c'est que je ne peux pas reproduire ce problème sur mon ordinateur très régulièrement. Parfois, je vais avoir l'erreur mais la plupart du temps je ne le ferai pas.vb.net - Problème de refaire l'objet COM après la fermeture du programme

Fondamentalement ce qui se passe est que je crée un objet IE que mon programme contrôle ensuite pendant une longue période de temps. Qu'est-ce qui se passe est, si un utilisateur quitte le programme, il appelle oIE.Quit() puis ferme le programme. Cela devrait fermer Internet Explorer et tous les processus qui y sont associés.

Mais, le processus iexplorer ne finit pas par se fermer. Ensuite, lorsque l'utilisateur essaie de réexécuter le programme, nous obtenons cette erreur "System.Runtime.InteropServices.COMException (0x80004005): la création d'une instance du composant COM avec CLSID {0002DF01-0000-0000-C000-000000000046} à partir de l'IClassFactory a échoué en raison de l'erreur suivante: 80004005. ". Pour résoudre ce problème, nous fermons simplement les processus any iexplorer.exe qui sont ouverts et cela nous permettra de créer à nouveau notre objet ie. Cela arrive aussi si le programme plante et qu'ils tentent de le redémarrer.

Je ne suis pas sûr de ce qui cause cela ou s'il me manque quelque chose qui a à voir avec les objets com. Mais je suis simplement coincé.

Voici un code bien brancher ce code ne sera probablement pas reproduire les erreurs:

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

'kill ie object 
oIE.Quit() 

Répondre

1

L'exception que vous obtenez est sans espoir, c'est E_FAIL, « Erreur non spécifiée ». Il n'y a aucune raison évidente pourquoi ceci échouerait, en commençant une autre instance d'IE quand votre programme remet en marche ne devrait pas être un problème. Eh bien, à court de ces instances fantômes de IE qui continuent à fonctionner pour toujours. Je suppose que vous avez cette exception pour la même raison que IE n'a pas quitté lorsque vous avez appelé Quit() la dernière fois. Considérez le type d'erreur que vous allez créer lorsque votre programme avorte et ne se déplace pas pour fermer proprement IE. Utiliser Environment.Exit() serait très malsain par exemple. Ou tout autre type de kaboom désagréable qui ne laisse pas le thread du finalizer s'exécuter à la fin. Peut-être que cela s'est déjà produit plusieurs fois auparavant, maintenant IE refuse simplement de créer plus d'instances? Combien de fois devez-vous tuer quand vous avez besoin de le relancer?

Le meilleur piège à souris est ici d'exécuter IE in-process dans votre propre programme plutôt que hors processus avec SHDocVw. Alors que lorsque votre programme se termine, il prend IE avec lui. Il est également beaucoup plus efficace, il y a beaucoup de frais généraux impliqués dans les appels de serveur COM hors processus.

Pour ce faire, utilisez WebBrowser dans votre programme.

+0

Merci pour le conseil. La plupart du temps, l'application ne plante pas, donc nous n'aurons pas de processus fantômes mais quand cela arrivera, nous n'aurons généralement que 1. Il y a aussi une fonction au début du code qui trouve les objets cachés et essaye de lancez oIE.Quit() sur eux. Cela échoue à nouveau. J'ai regardé en commutant le webbrowser et ferai probablement le commutateur. Le seul problème est qu'il est plus difficile d'exécuter javascript et je crains que mes utilisateurs auront plus d'erreurs si je change. – Phil

+0

Javascript fonctionne aussi bien dans un WebBrowser. –

+0

Je vais examiner cela. – Phil