プロが教える店舗&オフィスのセキュリティ対策術

お世話になっております。
掲題の件でおしえてください。

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

A 回答 (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 …
    • good
    • 0
この回答へのお礼

早速のレスをありがとうございました。
御礼が遅くなりまして申し訳ありません。

結論から申し上げますと、
動作しない理由はその端末の環境不備にありました。
プログラムは正常に動作していました。

提示してくださった方法は知りませんでしたので、
次の機会に是非試してみたいと思います。
サンプルコード、リンク先の提示と、興味深く拝見しました。
丁寧にご回答いただき、ありがとうございました。

お礼日時:2011/12/23 12:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています