- ベストアンサー
VBについて教えてください。
1.a.exeでShell関数でb.exe起動したときにa.exeはみれなくして b.exeで終了するとb.exeはなくなりa.exeだけにしたいのですが どうすればよいのかおしえてください。 a.vbp RetVal = Shell("c:\b.exe", 1) ← b.exeの起動 b.vbp end ← 終了 b.exeが起動中はヤククにa.exeがなくなり、b.exeが終了すると a.exeが起動するようにしたいのです よろしくお願いします。 WINDOWS98でvb6.0で開発しています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。maruru01です。 APIを使ってShell関数で呼び出したプログラムを終了するまで、元のプログラムが待機している関数を自作しました。 a.vbpのForm1にb.exeを呼び出すためのコマンドボタン"cmdOpen"があるとします。 では。 Private Sub cmdOpen_Click() Dim FullPath As String 'b.exeのフルパス Form1.Visible = False FullPath = "c:\b.exe" WaitShell FullPath Form1.Visible = True End Sub 以下は標準モジュールに記述 Public Declare Function OpenProcess Lib "kernel32" _ (ByVal dwDesiredAccess As Long, _ ByVal bInheritHandle As Long, _ ByVal dwProcessId As Long) As Long '【機能】 : 既存のプロセスオブジェクトのハンドルを返す '【戻り値】 : (成功)指定したプロセスのオープンハンドル ' (失敗)NULL Public Const PROCESS_QUERY_INFORMATION = &H400& Public Declare Function GetExitCodeProcess Lib "kernel32" _ (ByVal hProcess As Long, _ lpExitCode As Long) As Long '【機能】 : 指定されたプロセスの終了状態を返す '【戻り値】 : (成功)0以外(終了していないときはSTILL_ACTIVEが格納される) ' (失敗)0 Public Const STATUS_PENDING = &H103& Public Const STILL_ACTIVE = STATUS_PENDING Public Declare Function CloseHandle Lib "kernel32" _ (ByVal hObject As Long) As Long '【機能】 : オープンしているオブジェクトハンドルをクローズする '【戻り値】 : (成功)0以外 ' (失敗)0 'アプリケーションを起動し、終了するまで待機する Public Sub WaitShell(AppPath As String, Optional SizeFocusmode As Integer = vbNormalFocus) Dim AppID As Long 'Shell関数の戻り値 Dim Process As Long 'OpenProcess関数の戻り値 Dim ExitCode As Long '終了コード Dim rc As Long AppID = Shell(AppPath, SizeFocusmode) Process = OpenProcess(PROCESS_QUERY_INFORMATION, 1, AppID) 'プロセスが終了していない間はDoEvents関数でOSに制御を戻す Do rc = GetExitCodeProcess(Process, ExitCode) DoEvents Loop While ExitCode = STILL_ACTIVE rc = CloseHandle(Process) End Sub