※当サイトの一部記事にはPRが含まれます

UWSCでCOMエラーが出たら、初心者が確認すべきチェックリスト。原因不明でもタスクキルで改善する場合もある。

TIPS
この記事は約8分で読めます。

マクロ・スクリプトとして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していないと、うまく動かないことが多いです。

「ちゃんと書いたのに実行されてない!」

というケースはウェイト処理が漏れていることが原因だったりします。

 

こちらの記事に記載した方法で共通部品などを作っておいて、適切な個所にウェイト処理を入れましょう。

UWSCの共通処理は、別ファイルにクラス化しておくと非常に便利ですよ。
共通処理は別ファイルに部品化しておくと、実装やメンテナンスが効率化できます。 UWSCでスクリプトを作成すると「.UWS」形式のファイルを作成するかと思います。 通常は、目的とする全ての処理をこの「.UWS」のファイルに記述します。 なので...

 

「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プログラミングで困ったとき用のお役立ち記事を取り揃えております~。

ブログ初心者が、作り方・運営で困ったら「teratail(テラテイル)」に聞いてみ?
WordPress、CSS、html、php、SEO…。ブログ運営って記事書くだけでなくて、色々難しい事が多いよね。 『登場人物の紹介』 くろ社長 仕事は社員に丸投げしたから、暇になったので個人ブログでも始めようと思うのだ。クロのセクシー水...
UWSCで画像認識できないときに読む。CHKIMGの使い方&便利関数&トラブル解決。
初心者でもわかる? ネットゲームなどのマクロスクリプト作成に利用されているUWSC画像認識入門。 本ブログではUWSCのTIPS記事などもたまに投稿していたりするのですが、記事のアクセス流入の検索キーワードなどを分析すると、どうやらネットゲ...
UWSCでログイン・ボタンクリック操作に迷ったら読む。5つのパターン別テクニック
ボタンも画像もOK。UWSCでWEBサイトのクリック操作やログイン処理に悩んだら読んで!HTMLタグ別攻略法。 UWSCでWEBサイトのボタンクリック操作(IEのDOM操作)の処理を書くときに、サイトごとにログインページ等のHTMLが違うの...
UWSCでリンクがクリックできないときに読む。どんなリンクもクリックしちゃう5つの方法。
「なんかリンクがクリックできないよ・・・」を解決します。 UWSCでIE操作を行う場合、「リンクのクリック」をしたいことはよくあります。 特にポイントサイトの場合、画面の遷移だけでなく、クリックポイントや検索ポイントを取得する際にも必要です...
UWSCのプログラム時、画面を閉じる処理を共通化しておくと非常に便利です。
「ウィンドウ(画面)を閉じる処理」はよくあるパターンなので、共通化すると便利ですね。 ウェブサイトを操作するプログラムなどを作ると、画面(ウインドウ)を閉じる処理を記述することは頻繁にあります。 もちろん、IEでセオリー通りにブラウザを起動...
UWSCスクリプトのIE11向けBUSYWAIT処理(コピペOK・ポップアップ対応済)。
UWSCスクリプトのCLKITEMやIESETDATAでボタンやリンクをクリックした後のBUSYWAIT処理は重要。 UWSCスクリプトでウェブサイトの自動化をする際に、「サイトを開く」「CLKITEMでリンクをクリックする」「IESETD...