• 締切済み

VB6.0 Shellによる終了監視について

VB6.0について困っております。 VB6.0にてファイル管理ソフトを開発しています。VBより他アプリ(MS OfficeやAutoCAD等)ファイルを起動させ、終了を監視(終了処理実行のため)しています。 具体的にはWshのshell.Runコマンドを使用して wsh.run("アプリ",NormalFocus,True)として起動させています。 ここで、複数ファイルを起動した場合、最後に起動したファイルが終了しないと、他の終了が検知できません。 例) ファイルAを起動 ファイルBを起動 ファイルCを起動 ファイルDを起動 ↓ ファイルAを終了 ←終了しても終了検知しない ファイルBを終了 ←終了しても終了検知しない ファイルCを終了 ←終了しても終了検知しない ファイルDを終了 ←終了するとA・B・C・Dの終了をまとめて検知し終了処理実行 これを、各ファイルごとに終了を検知させる方法はありませんでしょうか? よろしくお願い致します。

みんなの回答

  • techa
  • ベストアンサー率60% (41/68)
回答No.3

#1の再提案です。(^@^) 再度確認しますが、複数のソフトを非同期実行して、ファイルの終了 検知をおこなえばよいのですよね? VB6をつかっているということでしたから、 wsh.run(.....,false) のようにrunの第3引数をfalseにして起動すれば非同期実行できます。 ただ、非同期実行するだけなら Call Shell(実行ファイル名) べつにwshオブジェクトをつかうまでもないとおもうのですが、どちらでも 変わらないとおもいます。 終了検知のほうはAPIビューアで、FindWindowAPIを定義しておいて、 これでwindow検出を連続しておこない、検出できなくなったら ソフトが終了したと仮定し、すべてのソフトの終了が確認されたら という風にもっていけばよいだけのこととおもっていました。 もし、どうしてもWshをつかってやりたいなら、私なら AppActivateでもつかうでしょうか。 タイトル文字がわかっていれば使えるという手軽さもありますし、 戻り値として、正常終了かどうかが得られますので、FindWindowと おなじことが可能となるとおもいます。ただし、このメソッドをつかうと 見つかったアプリにフォーカス移動が生じてしまうので、気になる場合は 最小化起動でもしておくほかはないとおもいます。

go_lupin
質問者

お礼

遅くなって大変申し訳ありません。 ご提案いただいた通り、非同期実行にしてアプリ監視にしたいと思います。 ありがとうございました。

noname#221368
noname#221368
回答No.2

 参考です。Shellは同期動作をさせないので、終了監視が必要になると思います。私は、終了監視のコードを作るのが、不要に面倒だと感じます。Office系であれば、Object Liblaryを参照させて、Application Objectのインスタンスでファイル操作を行います。  問題は、AutoCAD等の部分ですが、少なくとも最近のAutoCADであれば、同じ事が出来るようになってないかな?、と思います。AutoCADのObjectも大分公開されてきましたので。

go_lupin
質問者

お礼

ご回答いただきまして誠にありがとうございます。 ご指摘の通り、インスタンスで制御できればいいのですが、取り扱う起動アプリが10種類以上あり、すべてを実現するのは難しい現状です。 ありがとうございました。

  • techa
  • ベストアンサー率60% (41/68)
回答No.1

Wshはつかったことがないのですが、wsh.runの第三引数でTrueを指定しているので、ファイルDを終了したときにはかならずA~Cは終了しているとおもうのですが。 やりたい内容がいまいち判然としないのですが、 1,ファイルA~Dを起動(終了待ちなし) 2.それぞれのファイルを個別にチェックして、終了確認 3.全ファイルが終了していたら、終了処理へ という内容を想定しているなら、 runの第3引数をfalseにして起動すれば、上記1ができますね。 上記2は少し、細工がいるかもしれませんが、わたしが実装するなら FindWindow APIをつかうでしょうか。 ただし、Window名があることが前提ですが、ExcelやAutoCADなら 大丈夫でしょう。

go_lupin
質問者

お礼

ご回答いただきまして誠にありがとうございます。 ファイルをひとつしか起動させないのなら、引数True指定で開いたファイルが終了するまで他の操作をさせないことことで実現可能なのですが、同時に複数起動を認めているため、このような事象が発生しております。 実アプリファイルをサーバからクライアントに転送し。DBにて排他管理を行っています。ですので。複数起動時に個々に終了を検知させ。排他クリアとクライアント⇒サーバへのアップを行いたいと考えています。 現状ですと、ファイルDを閉じないとファイルA・B・C・Dの終了処理(排他クリア・サーバアップ)ができないため困っております。 ありがとうございました。

関連するQ&A