IEオブジェクトについて、質問させてください。
IEオブジェクトをVisualBasicで操作中、
ネットワーク切断等でIEが強制的に閉じられた場合、
「リモート サーバーがないか、使用できる状態ではありません。」
等のエラーが発生してしまいます。
なので、IEオブジェクトが使用できる状態なのか
オブジェクトを操作する前に
チェックをしたいと思っていますが、
どのように判断すれば良いでしょうか?
Dim objIE as Object
' 初期化
Set objIE = Nothing
' WEBブラウザオブジェクト作成
Set objIE = CreateObject("InternetExplorer.Application")
Call objIE.GoHome
' WEBブラウザ可視状態に設定
objIE.Visible = blnVisibleFlg
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
この段階でIEを閉じると下の行でエラーが発生
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
' WEBブラウザにURLを設定
objIE.Navigate2 "http://www.yahoo.co.jp"
objIE.quit
IE の OnQuit イベントで対処できませんか?
魔界の仮面弁士様
ご回答いただきまして
有難うございました。
早速、試してみました。
私も熟知していないところがあるかもしれませんが、
OnQuit イベント
はプログラムの実行中の過程で切断された場合は
発生しないイベントではないかと現時点では考えております。
(下にサンプルプログラムを記述させていただきます)
もし、私の考えが間違っていなければ、イベント以外でIEが
切断された情報を拾わなければなりません。
何か、他の情報がありましたら、アドバイス頂けませんでしょうか
Private WithEvents objIE As InternetExplorer
Private Sub objIE_OnQuit()
Debug.Print ">>>>>>>>IE1 END >>>>>>>>"
End Sub
Private Sub Command1_Click()
Set objIE = CreateObject("InternetExplorer.Application")
Call objIE.GoHome
objIE.Navigate2 "http://www.yahoo.co.jp"
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
この段階でIEを閉じてもイベントは発生しない
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
objIE.quit
End Sub
> 発生しないイベントではないかと現時点では考えております。
そちらでは発生しないのですか? う〜む。変ですね。
通常の終了処理(IE右上の ×ボタンを押すなど)であれば、
OnQuit は発生するはずなのですけれども。
ところで、『ネットワーク切断等』とは、具体的にはどのような
状況なのでしょうか? (LANケーブルが抜けるとか?)
# 回線が切断されたぐらいで、IEが終了するとは思えなかったので…。
> (下にサンプルプログラムを記述させていただきます)
んんん……。
Visible = True にしていないのに、どうやってブラウザを閉じたのでしょうか?
もしも、IEのプロセスごと落ちてしまうような、致命的なエラーの話を
しているのだとしたら、事前にチェックするというのは、あまり意味が無いでしょうね。
(チェックしてから、実際に操作するまでの僅かなタイミングで
IE が落ちてしまう可能性も充分にありえるわけですから)
魔界の仮面弁士様
早速のご返信有難うございました。
ご指摘どおり、VisibleはTrueに設定しております。
記述漏れ、申し訳ありませんでした。
ですが、ブラウザが見れない状態でも、
タスクマネージャーで、プロセスを強制的に終わらせる
パターンでもテストをしております。
>もしも、IEのプロセスごと落ちてしまうような、致命的なエラーの話を
しているのだとしたら、事前にチェックするというのは、あまり意味が無いでしょうね。
>(チェックしてから、実際に操作するまでの僅かなタイミングで
IE が落ちてしまう可能性も充分にありえるわけですから)
上記のお話、全くその通りだと思います。
ですが、すくなくとも突然IEが落ちてしまうという例外をハンドリングできる可能性はとても高くなると思っています。
まず、何故突然IEのプロセスが落ちてしまうかを追求するべきでしょうが、あまりに不確定要素が多い為、原因を突き止めるには至っておりません。これについて、何か思い当たる要素がありましたら、ご助言頂けたらと思います。
Private WithEvents objIE As InternetExplorer
Private Sub objIE_OnQuit()
Debug.Print ">>>>>>>>IE1 END >>>>>>>>"
End Sub
Private Sub Command1_Click()
Set objIE = CreateObject("InternetExplorer.Application")
Call objIE.GoHome
objIE.Navigate2 "http://www.yahoo.co.jp"
objIE.Visible = true
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
この段階でIEを閉じてもイベントは発生しない
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
objIE.quit
End Sub
> タスクマネージャーで、プロセスを強制的に終わらせる
> パターンでもテストをしております。
『ネットワーク切断等』って、そういう意味の事だったのですね。(^^;
であれば、コンポーネントとの間での通信異常は、何らかの
実行時エラーとして通知されますので、On Error による
ハンドリングで対処可能だと思いますよ。
> 例外をハンドリング
別に、IEに限った話ではないですが、ActiveXコンポーネントを扱う場合、
常に何らかのエラーが起こる可能性があると思います。
そうでなくとも、ヘルプの「エラー処理ルーチンの構成」の項などを見ると、
『エラーにならないことがはっきりしている場合を除き、
通常、Basic のすべてのステートメントでエラーが
起こると考える必要があります。』
と書かれていますから、いずれにしても、エラー対処は常に必要でしょう。
実際の処理手順については、ヘルプの「エラー処理ルーチンの階層」の
[複雑なエラー処理のガイドライン]などが参考になるかも知れません。
> 突然IEが落ちてしまう
とりあえず、再セットアップを試みてみるとか。
http://support.microsoft.com/kb/318378
> 何故突然IEのプロセスが落ちてしまうかを追求するべきでしょうが
それは、特定のWebページに対して発生するのでしょうか?
http://nucleus.datoka.jp/?itemid=666
http://www.forest.impress.co.jp/article/2004/06/24/gifcrush.html
http://itpro.nikkeibp.co.jp/free/ITPro/NEWS/20050601/161972/
http://www.phoenix-c.or.jp/~zspc/cgi-bin/wwwlng.cgi?print+1999-06/99060023.txt
http://itpro.nikkeibp.co.jp/free/ITPro/NEWS/20050725/165214/
それとも、再現性が無いのでしょうか?
また、別のPC環境でテストしてみても、同じ動作になってしまうのでしょうか?
> あまりに不確定要素が多い為
考えられる点としては、たとえばシェルエクステンションの不具合/不整合や、
IE用アドイン(ツールバー等、JAVA VM等)のバグ等による異常動作、あるいは
セキュリティ系の監視ソフトの問題などが挙げられますが……特定は難しそうですね。
MSDN Subscriptionの契約があるなら、Virtual PC 等で、クリーンな環境を
用意して、そこでテストしてみては如何でしょう。
(それで問題が出ないなら、問題の出る環境に徐々に近づけていって様子を見る)
で、どうしても原因を特定できないなら、MS のサポートを利用するとか。
http://www.microsoft.com/japan/microsoftservices/support/SupCompare.asp
魔界の仮面弁士様
早速のご返信、ありがとうございました。
様々なアドバイスを頂いた情報を元に、
調べておりました。
結果、やはりエラーハンドリングをすることが
適当な処理ではないかと思っております。
http://www.microsoft.com/japan/developer/library/VBCon98/vbconhandlingruntimeerrors.htm
上記のサイトの記述によれば、エラーハンドリング後に
WordのApplicationのインスタンスを再作成しているのですが、
IEでは、一度解放してしまったブラウザオブジェクトを引き継いで
再度取得できるのか。という課題が残ってはいますが、
今回の質問に関しては「解決」ということにさせて頂きます。
有難うございました。
ツイート | ![]() |