2010-12-02 2 views
0

運がない日にこの問題の解決策を探していたので、ここに投稿して誰かが私を助けてくれることを願っています。それをさらに困難にするのは、私のコンピュータ上でこの問題を非常に一貫して再現することができないということです。時々私はエラーを得るだろうが、ほとんどの時間私はしません。vb.net - プログラムを終了した後のCOMオブジェクトの再作成の問題

基本的に何が起きているのですか?自分のプログラムが長期間コントロールしているIEオブジェクトを作成しています。何が起こっているのか、ユーザーがプログラムを終了すると、oIE.Quit()を呼び出してプログラムを閉じます。これは、インターネットエクスプローラとそれに関連するすべてのプロセスを終了するはずです。

しかし、iexplorerプロセスは終了しません。 IClassFactoryからCLSID {0002DF01-0000-0000-C000-000000000046}のCOMコンポーネントのインスタンスを作成できませんでした。このエラーは、ユーザーがプログラムを再度実行しようとすると発生します。 "System.Runtime.InteropServices.COMException(0x80004005)次のエラー: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

例外はそれがE_FAIL、「予期しないエラー」だ、絶望的です。これが失敗する理由は明白ではありません。プログラムの起動時にIEの別のインスタンスを起動しても問題ありません。まあ、永遠に稼働し続けているIEのゴーストインスタンスからは短いです。最後にQuit()を呼び出したときにIEが終了しなかったのと同じ理由でこの例外が発生したと思います。

あなたのプログラムが中止され、IEをきれいにシャットダウンしようとしないときに、あなたが作成する事態を考えてください。 Environment.Exit()を使用すると、例えば、非常に不健康になります。または終了時にファイナライザスレッドを実行させない他の種類の厄介なkaboom。たぶんこれまで何度も起こったことがありますが、IEはこれ以上のインスタンスを作成することを拒否しますか?あなたがもう一度それを取得する必要があるときにいくつのインスタンスを殺す必要がありますか?

ここで、はるかに優れたマウストラップは、SHDocVwを使用してプロセス外ではなく、独自のプログラムでIEをインプロセスで実行することです。あなたのプログラムが終了すると、それとIEが必要になります。はるかに効率的です。アウトオブプロセスのCOMサーバーコールを作成する際のオーバーヘッドが大きくなります。

プログラムでWebBrowserを使用してこれを行います。

+0

アドバイスをいただきありがとうございます。ほとんどの場合、アプリケーションはクラッシュしないので、ゴーストプロセスはありませんが、通常は1しかありません。コードの最初に隠れたオブジェクトを見つけ出してそれらに対してoIE.Quit()を実行します。これは再び失敗します。私はウェブブラウザの切り替えを検討しており、切り替えを行う可能性が高いです。唯一の問題はjavascriptを実行するのが難しく、私が切り替えるとユーザーのエラーが増えると心配です。 – Phil

+0

Javascriptはウェブブラウザーでも同様に動作します。 –

+0

私はこれを調べます。 – Phil

関連する問題