起動させたアプリケーションの終了を知る(T)         <TOP>


例ではメモ帳を起動し、それが終了したことをメッセージボックスに表示させています。

WaitForSingleObject 指定された時間が経過するまでスレッドをスリープ

CreateProcess プロセスの起動

CloseHandle オープンされているオブジェクトハンドルをクローズ

GetExitCodeProcess 指定プロセスの終了コードを取得

 

左:メモ帳起動ボタンをクリック    右:処理後、メモ帳を終了させる

 

下:終了したことが通知される

参考(・・というより丸写し)

http://support.microsoft.com/default.aspx?scid=KB;en-us;q129796
 

'================================================================
'= アプリケーションを起動し終了したことを得る(T)
'= 参考:http://support.microsoft.com/default.aspx?scid=KB;en-us;q129796
'=    (GetExitCodeProcess.bas)
'================================================================
#include "Windows.bi"

Type STARTUPINFO
    cb As Long
    lpReserved      As Long
    lpDesktop       As Long
    lpTitle         As Long
    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 Api_WaitForSingleObject& Lib "Kernel32" Alias "WaitForSingleObject" (ByVal hHandle&, ByVal dwMilliseconds&)

' プロセスの起動
Declare Function Api_CreateProcess& Lib "kernel32" Alias "CreateProcessA" (ByVal aNm$, ByVal ComLine$, ByVal ProcAttr&, ByVal thAttr&, ByVal Handl&, ByVal Flags&, ByVal Environ&, ByVal Dir$, StartupInfo As STARTUPINFO, ProcInfo As PROCESS_INFORMATION)

' オープンされているオブジェクトハンドルをクローズ
Declare Function Api_CloseHandle& Lib "Kernel32" Alias "CloseHandle" (ByVal hObject&)

' 指定プロセスの終了コードを取得
Declare Function Api_GetExitCodeProcess& Lib "kernel32" Alias "GetExitCodeProcess" (ByVal hProcess&, lpExitCode&)

#define NORMAL_PRIORITY_CLASS &H20      '通常クラス(一般的なプロセス)
#define INFINITE &HFFFF                 '無限に中断

Var Shared Button1 As Object

Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

'================================================================
'=
'================================================================
Declare Function ExecCmd(cmdline$)
function ExecCmd(cmdline$)
    Var pi As PROCESS_INFORMATION
    Var si As STARTUPINFO
    Var Ret As Long

    'STARTUPINFO構造体の初期化
    si.cb = Len(start)

    'アプリケーション起動
    Ret = Api_CreateProcess(ByVal 0, cmdline$, 0, 0, 1, NORMAL_PRIORITY_CLASS, 0, ByVal 0, si, pi)

    '起動されたアプリケーションが終了するまで待つ
    Ret = Api_WaitForSingleObject(pi.hProcess, INFINITE)
    Ret = Api_GetExitCodeProcess(pi.hProcess, Ret)
    Ret = Api_CloseHandle(pi.hThread)
    Ret = Api_CloseHandle(pi.hProcess)
    ExecCmd = Ret
End Function

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var Ret As Long

    'メモ帳を起動
    Ret = ExecCmd("notepad.exe")
    A% = MessageBox("", "プロセスは終了しました!。終了コード:" & Str$(Ret), 0, 2)
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End