PR

このサイトは、広告などを含みます。

最終更新日:

InternetExplorer終了中のオートメーションエラー?(エラーコード=800704A6)

  InternetExplorer(IE)をプログラムから起動する際にShDocViewを使用して起動するのが一般的なやり方だと思います。
ここまでは、特に問題は、ありません。


 
 問題は、IEを閉じる際です。
 タブが少数の状態で閉じるとあまりお目にかからないのですがタブを多く開いた状態でIEを全部閉じて直ぐにShDocViewを使用してIEを起動するとNavigate2を叩いた辺りでエラーコード=800704A6のエラーが出てIEを起動することが出来ません。


 何かと思い調べて見るとどうやら「ERROR_SHUTDOWN_IS_SCHEDULED」という名前で割り当てられているコードでそのまま読むと終了が予定されているエラーです。
 ようするに終了予定か終了処理中だからそのオブジェクトは、使えませんよ。という事なんだと思います。


 
 スパーンという具合に一瞬でメモリ上から消えてくれれば多分こんなエラーは、出ないのでしょうけどアチラコチラのサイトを開いた状態でIEをバッテンボタンで全終了するとディスクアクセスしまくって終了処理中と思われる状態になります。
 その状態で再度SvDocView経由でIEを起動すると何度やっても「800704A6」エラーなのです。
「終わるまで待ち給え。」と言わんばかりです。で、IEでタブ少数開いた状態で終了すると一瞬で終了するのですが多くのタブを開いた状態と少数のタブを開いた状態で何が異なるかというとタブが多く開いている状態だとどうやらIEの元プロセスも一緒に終了してから再起動するみたいなのです。
 この場合は、終了処理が遅くなります。
 
 最近のIEは、メインになる親プロセスが1個起動しての子プロセスとして複数のプロセスが起動します。
 当方のWin7_64bit+IE11は、IE起動すると親1個に4個のプロセスが起動します。
この子プロセス数を上回るタブを開いた状態でIEを全終了すると親プロセスも終了する確率が高いような気がしますが終了しない場合もあるようなので親プロセスが終了する条件が良く分かりません。


 で、結局終了待ち中は、IEが自作アプリから再起動できないという問題をどうやって回避したかと言うとProccess.StartでIEのEXEを直接起動した上で起動したIEのShDocViewを捕まえるようにしましたとさ。
IE全終了したという事は、IEの有効なプロセスは、いないはずだしそこへ新たにIEをProccess.Startで起動すればIEのプロセスは、新規品なので1個目のプロセスを捕まえればOKかな?と。
 一応今のところ問題無いです。


SvDocViewで起動できなくてProccess.Startだと起動できるのは、何故?
SvDocViewは、存在するプロセスを検索して現存するIEのプロセスを用いてIE画面を起動するのに対してProccess.Startは、新規にプロセス自体を起動するという動作をするのが違いみたいです。


 ただ、IEが終了処理中では、無く通常どおりプロセスが起動している状態でProccess.Startを使うと新規のタブとして追加されるので内部的には、その時の状態に応じて処理を分岐しているのかなぁ?とも思いますがこの辺りは、当方の勝手な推測です。この辺りの資料が発見できませんでした。
 もう一つ異なる点としては、通常のIEは、エクスプローラーの子供としてプロセスが起動しますが終了処理中にProccess.StartでIEを起動すると親は、起動したアプリになるみたいです。(SPあたっていないVistaの時は、保護モード状態かどうかとか権限とかも関係あったみたいですがSysInternalのプロセスビューワーで見た限りは、Win7は、そういう事無いっぽいです。目視なので実際は、不明)
 終了処理中のIEがある状態でProccess.StartでIE起動すると終了処理中のIEが終了完了してOSがIEを再起動するとIEが既にいるのでそちらは、キャンセルされます。かわいそう・・・。


 IEのプロセス捕まえてイベント判定とか色々したい訳では、無く、単純にIEでURL開くだけならProccess.Startで十分なんですけどね。

0 件のコメント :

コメントを投稿