execでなく、CreateProcess関数で実行すれば直接プロセスIDが取れますよ。
終了には、taskkillコマンドを/fオプションを付けずに使い、通常終了させます(強制終了させると終了時の処理がされないので)
#uselib "kernel32.dll"
#func CreateProcess "CreateProcessA" sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr
#define NULL 0
#define FALSE 0
#define CREATE_NO_WINDOW 0x8000000
#func CloseHandle "CloseHandle" sptr
// 実行するファイル選択(一応カレントディレクトリは元に戻す)
originalCurDir = dir_cur
dialog "exe", 16, "実行可能ファイル"
if (stat == 0) : end
fileName = refstr
chdir originalCurDir
// 起動
dim startupInfo, 17
startupInfo(0) = varsize(startupInfo)
dim processInfo, 4
CreateProcess fileName, "", NULL, NULL, FALSE, 0, NULL, NULL, varptr(startupInfo), varptr(processInfo)
hProcess = processInfo(0)
hThread = processInfo(1)
processId = processInfo(2)
;threadId = processInfo(3)
button "終了",*owari
stop
*owari
// 終了(taskkillコマンドで、強制終了ではなく通常終了させる。CREATE_NO_WINDOWフラグでコマンドプロンプトが表示されないように)
dim startupInfoCmd, 17
startupInfoCmd(0) = varsize(startupInfoCmd)
dim startupInfoCmd, 4
CreateProcess NULL, strf("cmd.exe /c taskkill /pid %d", processId), NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, varptr(startupInfo), varptr(processInfo)
CloseHandle startupInfoCmd(0)
CloseHandle startupInfoCmd(1)
// プロセス・スレッドのハンドルを閉じる
CloseHandle hProcess
CloseHandle hThread
end