• 締切済み

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

  • WSHプログラミングで、Shell実行プロセスが終了しない内に、次の処理が実行されちゃいます・・・

    WSH(WindowsScriptingHost)でプログラミングを行っております。 以下のように、「A.exe」実行後、「B.exe」を実行するようにスクリプトを記述しています。 ところが、実際に実行してみると、「A.exe」が終了しない内に、「B.exe」が実行されてしまっている様なのです。 しかし、プログラム処理上、「A.exe」が実行終了してからでないと、「B.exe」を実行するのはまずいのです。 WSHで、「A.exe」が実行終了するまで、「B.exe」を実行させないようなスクリプトの記述方法を教えて下さい。 Set Shell = CreateObject("WScript.Shell") Shell.Run "cmd.exe /c D:\A.exe" Shell.Run "cmd.exe /c D:\B.exe"

  • 複数の処理の終了を待ちたい

    お世話になります。以下、教えていただけますでしょうか? バッチファイル(A.bat)を作成しています。 そのなかで、a,b,c,dの複数のプログラムを、前処理の終了を待たずに起動させ、a,b,c,d全てが終了するのを待って、eというプログラムを実行させたいのです。 --------------- start a start b start c start d --------------- この記述で、a,b,c,dが一度に起動することは確認できました。 しかし、この後の、「a,b,c,d全ての終了を待ってeを起動させる方法」というのが分かりません。 教えていただけますでしょうか? それとも、そもそも、バッチでは実現不可能なのでしょうか?

  • shell関数について

    毎度、お世話になっています。 現在、C言語で書いた複数のプログラムをBATファイルで処理するように記述しています。VBでその制御を行っているのですが、VBの処理手順として子フォーム(textあり)にデータを書きこんで、ボタンを押すとshellでbatファイルを起動し、バッチファイルの結果として、あるディレクトリにresult.txtが作成され、VBで他の子フォームに読みとらせようとしているのですが、shellだと、実行の終了を待たずに次にいってしまうので、そのバッチファイルの実行処理が終わらず、result.txtの内容を読み込むことができません。 待つようにするにはどうすればよいのでしょうか? ちなみにVBは一週間前にはじめて、自分でも調べてなんとか作ろうとしたのですが、時間がないため、ここに質問させていただきました。なるべく簡単なアルゴリズムで、よろしくお願いします。 VBのプロセス    テキストにデータを書き込む      ↓     ボタン   →        テキストの内容を*.txtとして保存                        ↓                      バッチファイル起動    ↓(ここで右の実行を待たない     ↓     ので読み込むことができない)   C言語で書かれたプログラム実行                        ↓ result.txtを    ←        結果としてresult.txtが出来上がる 読み込んで表示     

  • VBプログラムの終了

    VB6.0で作成した実行ファイル(exe)を終了させても タスクマネージャのプロセスに残ってしまい、 もう一度プログラムを起動することができません。 (プログラムで二重起動防止の処理をしています) このプログラムをVBのラインタイムが入っていない マシンで動かしているのですが、 やはりそれが問題なのでしょうか? それとも別に何か原因があるのでしょうか?

  • Shell関数?

    いつもお世話になってます。 XPでMicrosoft Visual Basic 2008 Express Editionを使ってます。 A.exeとB.exeを作りました。 Aを実行→OKボタンを押す→Bが実行される というのを作ったんですが、 <Aのプログラム> Private Sub Button1_Click(ByVal sender As System.Object,   ByVal e As System.EventArgs) Handles Button1.Click  Shell("C:\B.exe", AppWinStyle.NormalFocus)  Me.Close() End Sub を実行するとBが二度(?)実行されて(途中で止まってるような・・・) 「別のプロセスで使用されているため、プロセスはファイル"C:\B.exe"にアクセルできません。」 となります。 ちなみにB.exeはPC起動時は常に表示されるようにつくりました。 説明が足りないかもしれませんが解決しなくて困ってます。 どうしたら解決するか教えてください。

  • VB6からEXCELマクロの終了を判断する方法を教えてください。

    VB6からEXCELマクロの終了を判断する方法を教えてください。 VB6とEXCEL(VBAも含む)を使って次のような流れの処理を行うソフトを作っています。 そこでどうしてもEXCELマクロの終了をVB6から判断する必要があり、方法を教えて頂けないでしょうか。 1)VB6でEXCELファイルを起動 2)VB6からセルA1に10,A2に20を代入 3)VB6からEXCELファイル内のマクロをコール 4)マクロはA1+A2の計算を行いA3に代入(30) 5)VB6からA3の値を読み込む (実際にはマクロは複雑な処理をします。) 1)~5)の処理を5000回程度行います。 VB6から送られるデータは毎回変わり、EXCELとマクロで計算させたデータを回収してテキストファイルに書き出します。 一通りのプログラムは完成したのですが、計算したデータを見ると10+20が1.99999とか15.51414とかおかしい結果になっています。 もしかしたらマクロの実行が終わっていない段階でVB6がデータを拾ってしまっている??と考え、マクロの終了をVB6で判断してからデータを回収するようにしたいと思っています。 何か方法はないでしょうか。(または他に間違っているところがあるのでしょうか。) 長文ですみません。よろしくご教示ねがいます。

  • VB6のWScript.Shellについて

    VB6のWScript.Shellで、他のVB6プログラムを起動する時の戻り値について教えてください。 AというVBプログラムからBというVBプログラムを起動するシステムがあります。 Bというプログラムで取得した値をAに返す方法はありますでしょうか? Aのソースは以下の通りです。 --------------------------------------------- sub test() dim objWshShell set objWshShell = Wscript.CreateObject("WScript.Shell") objWshShell.Run "C:\B.exe" & " " & hikisu1 & " " & hikisu2 , 1, wait End Function ---------------------------------------------- objWshShell.Runの戻り値はtrueまたはfalseのみのようです。 B.exeからtrue、false以外の値を取得する方法はありますか? また、やり方はobjWshShell.Runでなくてもよいです。 よろしくお願いします。

  • VB2007の再インストールが出来なくて困っております

    状況的には、1台のHDDに、CとDのパーテンションを作成し、Cにはシステム関連を、Dにはアプリケーションおよびデータ関連をインストールしています。 先日誤ってDドライブをフォーマットしてしまい、VB2007が起動しなくなりました(インストールされているDドライブをフォーマットしたのであたりまえ・・・・苦笑) VBを再インストールすべくsetupを実行するのですが、削除プログラムが起動します。 Cドライブに関連ファイルが残っているためだろうと判断し、インストールされている関連ファイルを削除すべく、アンインストールプラグラムを実行するのですが、以下のメッセージで、セットアップが終了してしまいます。 ============================ 「セットアップの終了」 ウィルスバスター2007のインストールを完了する前に、セットアップが中断されました。 システムの状態は変更されていません。改めてインストールする場合は、再度セットアップを実行してください。 「終了」をクリックして、セットアップを終了してください。 ============================ 対処方法をご教授ねがいます。

  • VB4での保存と表示について

    VB4についてです。 1度目の実行でa=1,b=2,c=3 2度目の実行でa=2,b=5,c=9 3度目の実行でa=3,b=7,c=0 このような組んだプログラムを実行することによって得た数値を他のファイルに保存して a b c 1 2 3 2 5 9 3 7 0 のように表示するにはどのようにすればいいのでしょうか? よろしくお願いします。

  • VBスクリプト---アプリの終了について

    VBスクリプト---アプリの終了について お世話になります。 VBスクリプトを使い始めたのですが、アプリの終了の仕方が分かりません。 起動は、 WSHShell.Run とか、 objShell.Run で分かるのですが、終了のメソッドが分からないのです。 どなたかご教示ください