• 締切済み

WSH.Runで待機できません

お世話になっております。 掲題の件でおしえてください。 Set objWshShell = CreateObject("WScript.Shell") ret = objWshShell.Run("abc.exe", 0, true) 上記のようなコードで、同期をとって外部プログラム(abc.exe)を実行させています。 abc.exeの中では別の外部プログラム(Setup.exe:InstallShieldで作成)を 同様にWSHで同期を取って実行させています。 上記コードををループを使って実行したところ、 Setup.exe実行中にabc.exeの処理が終了してしまうようで、意図した動作となりません。 どのようにしたら、Setup.exe終了を待機して、abc.exeを終了させられるのでしょうか? よろしくお願いいたします。 Win7;VB6

みんなの回答

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

VB6でやっているならCreateProcessという APIで起動制御する方法が確実です。 このAPIはプロセスを起動し、スレッドと、 プロセスのハンドルを返します。 WairForSingleObjectというAPIでプロセス ハンドルを待機すれば、プロセス終了まで 停止した状態になります。 Type STARTUPINFO     cb As Long     lpReserved As String     lpDesktop As String     lpTitle As String     dwX As Long     dwY As Long     dwXSize As Long     dwYSize As Long     dwXCountChars As Long     dwYCountChars As Long     dwFillAttribute As Long     dwFlags As Long     wShowWindow As Integer     cbReserved2 As Integer     lpReserved2 As Long     hStdInput As Long     hStdOutput As Long     hStdError As Long End Type Type PROCESS_INFORMATION     hProcess As Long     hThread As Long     dwProcessId As Long     dwThreadId As Long End Type Declare Function CreateProcessA Lib "kernel32" _   (ByVal アプリ As Long, _    ByVal コマンド As String, _    ByVal プロセス継承 As Long, _    ByVal スレッド継承 As Long, _    ByVal 継承有無 As Long, _    ByVal フラグ As Long, _    ByVal 環境変数 As Long, _    ByVal カレント As Long, _    開始情報 As STARTUPINFO, _    プロセス情報 As PROCESS_INFORMATION) As Long Declare Function WaitForSingleObject Lib "kernel32" _   (ByVal ハンドル As Long, _    ByVal ミリ秒 As Long) As Long Declare Function CloseHandle Lib "kernel32" _    (ByVal ハンドル As Long) As Long プログラムはこんな感じ Dim 開始情報 As STRATUPINFO Dim プロセス As PROCESS_INFORMATION 開始情報.cb = Len(開始情報) '★必ず成功すると思って戻り値は調べない CreateProcessA 0, "Setup.exe ~", 0, 0, 0, &H20, 0, 0, _   開始情報,プロセス '★スレッドは不要なので直ぐ閉じる CloseHandle プロセス.hThread '★終わるまで待機する(-1は無期限待機の意味) WaitForSingleObject プロセス.hProcess, -1 '★終了後は閉じる CloseHandle プロセス.hProcess この方法はあらゆるアプリに対して使用できる。 というか、Windowsの基本アーキテクチャだから。 STARTUPINFOを使いこなすと、面白いこともできる。 CreateProcessの本当の定義ではアプリやカレントは 文字列だし、スレッド継承やプロセス継承はセキュリティ 記述子へのポインタなのだが、どうせNULLを指定する からLong型で定義している。&H20は通常プライオリティを 意味する値で長い定義名があるのだが、面倒なので 直定数にしました。興味があったら調べてください。 http://msdn.microsoft.com/ja-jp/library/cc429066.aspx

sugar_donut
質問者

お礼

早速のレスをありがとうございました。 御礼が遅くなりまして申し訳ありません。 結論から申し上げますと、 動作しない理由はその端末の環境不備にありました。 プログラムは正常に動作していました。 提示してくださった方法は知りませんでしたので、 次の機会に是非試してみたいと思います。 サンプルコード、リンク先の提示と、興味深く拝見しました。 丁寧にご回答いただき、ありがとうございました。

関連するQ&A