EXE1とEXE2があり、EXE1からEXE2のボタンにSendMessageでBM_CLICKを送っています。EXE2のボタンの処理は Unload Me のみです。
このとき、以下のエラーがでて強制的にEXE2が落ちます。なぜでしょうか?
「オートメーションエラーです。
アプリケーションが入力同期呼び出しをディスパッチしているため、呼び出せません。」
エラーの理由は
http://www.bcap.co.jp/hanafusa/logbbs1/wforum.cgi?no=2078&reno=2065&oya=2065&mode=msgview
がぐーぐる検索で引っ掛かりました。
ありがとうございます。
そこは見ました。確かに平行というかそういった処理はしています。
EXE2は起動したら、タイマーを有効にし、IEを立ち上げ(非表示)てIEの読み込みが終了するとそのまま
IEとEXE2は立ち上げたままにして、タイマーも動いたままにしています。
タイマーの処理(一秒間隔)は、別のウィンドウを監視して見付からなければEXE2を終了
という処理をしています。しかし、別のウィンドウはEXE1が起動している間は起動しているので、タイマーの処理は実際は何もしていない状態です。
EXE2の処理は Unload Me のみと書きましたが実際はタイマーを無効にした後に
Unload Me しています。
原因というか一応エラーは出なくなりました。
Unload Me したあとの Form_QueryUnload の処理でエラーになっていました。
Form_QueryUnload の処理は、
IE.Quit
Set IE = Nothing
です。
IE.Quitの時にたぶんそのエラー(VBがだしている?)が出ています。
IEは [Set IE = New SHDocVw.InternetExplorer] として作成していますが
IEを終了させる時は [Set IE = Nothing] だけでよいのでしょうか?
IE.Quitで終了さした後に [Set IE = Nothing] を通常はしていますが・・・。
> IEを終了させる時は [Set IE = Nothing] だけでよいのでしょうか?
駄目でしょう。そのまま終了せずに残ってしまうはずです。
たとえば、
Set x = CreateObject("InternetExplorer.Application")
x.Visible = True
Set x = Nothing
という 3行だけの単純なアプリを実行させてみると解りますよね。
> IE.Quitで終了さした後に [Set IE = Nothing] を通常はしていますが・・・。
その手法も微妙かも。
間違っているわけではありませんが、IE の終了はプログラムから Quit が
呼び出された場合だけではなく、スクリプトから window.close() された
場合や、手動操作で終了させられた場合もありえますので、Quit しようと
した時には、既に IE が居なくなっている可能性もゼロではありません。
できれば、OnQuit を併用された方が良いのではないかと。
ツイート | ![]() |