マクロ・スクリプトとしてUWSCを使ってIE処理していると、たまにアプリのCOM_Error、フリーズ、クラッシュ、強制終了などが発生する場合がある。
IEなどの操作をUWSCで実行していると、以下のような現象が発生する場合があります。
「COM_Error:システムのシャットダウンは既にスケジュールされています。」
「COM_Error:例外が発生しました。」
「COM_Error:リモート プロシージャ コールに失敗しました。」
「COM_Error:RPC サーバーを利用できません。」
IEがフリーズしていてUWSCの処理がいつまでも終わらない。
メッセージ、ポップアップに妨害されてエラーで強制終了。
何だかよくわからないが、IEが壊れて動かない。
何だかよくわからないが、エラーメッセージでIEが強制終了する。
常にエラーになってしまう場合は、プログラム自体に問題がある可能性が高いので、ソースコードを直せばよいわけです。
しかし、「いつもじゃないけど、たまに出るエラー」というのは原因がよくわからない場合が多く、厄介なものです。
調べて原因特定するのも大変ですしね(-。-;)。
UWSCは基本的にPC作業を効率化するためのものです。
なので、他の一般的なプログラム言語と異なり、サクッと時間かけず作って動かすことを目的とする場合が多いわけでして、トラブルシューティングに時間をかけるのは非合理的です。
極力、手間をかけずに改善したいところですね。
まずは、プログラムに不正な部分がないか確認する。初心者がまず確認すべきチェックリスト。
やりたいことの実現方法、プログラム構成、ロジックに論理的におかしいところがないかチェックする。
スクリプト言語自体の書き方の問題ではなく、そもそもの考え方が誤っているケースがあります(何を実現したいのか不明瞭、実現内容に対する処理ロジック構成が不明瞭、プログラム構成がおかしい、UWSCではできない処理・向いていない処理、等)。
実現方法、プログラム構成、ロジックが本当にそれで良いのか再確認しましょう。
この判断には、WEBやブラウザ(IE/firefox/Chrome)やCOM操作の知識や、一般的なプログラミング技能(要件の整理、プログラム構成の検討、ロジックの組み方・考え方、運用方法検討・障害対応など)が必要になることが多いです。
UWSCはオンラインゲームの自動化などで広く利用されることが多く、知識・技能が足りないユーザがスクリプトを作成しようとして失敗するケースが散見されます(いわゆる超初心者が、ネットで拾ってきたコピペのソースを理解しないで利用しているケースなど)。
まずは基本を体系的に学んだ方が良いと思います。
これは面倒なようですが、長い目で見ると逆に近道です。
これからの時代は人間の作業の多くは人工知能・ロボットに任せることになりますので、これらを有効活用するためにIT知識は必須になります。
一部の処理がうまく動かない場合は、BUSYWAIT、SLLEEPを適切に入れてみる。
UWSCでIEをCOM操作する場合、しっかりとBUSYWAITしていないと、うまく動かないことが多いです。
「ちゃんと書いたのに実行されてない!」
というケースはウェイト処理が漏れていることが原因だったりします。
こちらの記事に記載した方法で共通部品などを作っておいて、適切な個所にウェイト処理を入れましょう。
「COM_Error:システムのシャットダウンは既にスケジュールされています。」はほぼCREATEOLEOBJの失敗。
IE操作の場合よくあるエラーですが、私の場合はWINDOWS10にしたら頻発するようになりました・・・。
基本的に以下で改善しますが、微調整が必要な場合もあります。
IE11にて画面更新後に操作(COM)ができない #N45
IE11 では一度アクティブ状態にする必要があります。
ので画面更新の後に IEに対して WM_ACTIVATE を送り操作可能にします。
DEF_DLL SendMessageA(Hwnd, Long, Long, Dword): bool: user32 CONST WM_ACTIVATE = $06 Procedure BusyWait(ie) // 更新待ち処理 repeat Sleep(0.2) until (! ie.busy) and (ie.readyState=4) SendMessageA(ie.Hwnd, WM_ACTIVATE, 0, 0) // 更新直後に WM_ACTIVATEを送る事によりバックグランドでも操作可となる Fend
IE終了後にまた CREATEOLEOBJ関数にて IEを起動するとエラー(“システムのシャットダウンは既にスケジュールされています”)が出る #N46
通常起動の場合にはエラーが出ませんので、以下のようにすると避ける事ができます。
try IE = CREATEOLEOBJ("InternetExplorer.Application") except EXEC("C:\Program Files\Internet Explorer\iexplore.exe") IE = GETACTIVEOLEOBJ("InternetExplorer.Application") endTry
ログを出力させるなどして、エラー原因を容易に特定できるようなプログラムにしておく。
UWSCで出力されるエラーには、「COM_Error:例外が発生しました。」のような、原因が特定しにくいものもあります。
UWSCのログだけでは原因を判別しにくいので、個別ログ出力を実装しておきましょう。
以下のようなものをログに出せるようにしておくと、いつどこでエラーになったのか特定しやすくなります。(パラメータで簡単にON/OFFできるようにしておくと便利です。)
処理日時・時間。
分岐がある場合、どのステップを通ったか。
遷移したURL・処理したURLなど。
処理中・アクティブになっているウインドウのタイトルなど。
画像認識が成功したかどうか失敗したかどうか。
原因が不明でも、タスクキルしてIEを起動しなおすと、動作が安定する場合もあります。
いつも発生するエラーでなく、たまに発生するエラーの場合は、その時だけ何かIEがおかしくなっていることもあります。
IEを閉じる場合、以下のような処理を組み込むことが多いです。
// 全IEクローズ PROCEDURE CLOSINGIE() for i = 0 to GETALLWIN()-1 if POS("iexplore.exe", STRCONV(STATUS(ALL_WIN_ID[i], ST_PATH),SC_LOWERCASE)) <> 0 then CTRLWIN(ALL_WIN_ID[i], CLOSE) next FEND
しかし、この処理だけでは例外メッセージが出ていて妨害している場合や、IEがフリーズしている場合に、画面を閉じることができないケースもあります(WINDOWS10になって増えた気がします・・・(;^ω^)。)。
このような場合は、DOSCMD関数でコマンドプロンプトを実行し、IEのタスク自体を切ってしまうのも有効です。
DOSCMD("taskkill /f /im iexplore.exe")
処理内で時折タスクキルを実行し、IEを起動しなおす処理を入れておくと、動作が安定しますよ(^◇^)。
UWSC記事
UWSCプログラミングで困ったとき用のお役立ち記事を取り揃えております~。