プロセスの起動は、CreateProcess()関数で行います。CreateProcess()関数で起動した プロセスは起動元のプロセスと平行で動作しますので、CreateProcess()関数は起動した プロセスの終了は待ちません。プロセスの終了まで待機したい場合は、WaitForSingliOnject() 関数などで待機してください。
CreateProcess()関数から取得できるPROCESS_INFORMATIONの情報 にプロセスのハンドル情報が返ってきます。このハンドルの情報は、必要が無くなった時点で CloseHandle()関数で解放する必要があります。
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <windows.h>
/*
プロセスを起動する
*/
int _tmain
(
int argc
, _TCHAR* argv[]
)
{
// 標準出力にユニコード出力する
setlocale( LC_ALL, "Japanese" );
HRESULT hResult = E_FAIL;
STARTUPINFO tStartupInfo = { 0 };
PROCESS_INFORMATION tProcessInfomation = { 0 };
/*
プロセスの起動(notepadを起動する)
*/
BOOL bResult = CreateProcess(
L"c:¥¥Windows¥¥System32¥¥notepad.exe"
, L""
, NULL
, NULL
, FALSE
, 0
, NULL
, NULL
, &tStartupInfo
, &tProcessInfomation
);
if ( 0 == bResult ) {
return( HRESULT_FROM_WIN32( ::GetLastError() ) );
}
/*
プロセスの終了を待つ
*/
DWORD dwResult = ::WaitForSingleObject(
tProcessInfomation.hProcess
, INFINITE
);
if ( WAIT_FAILED == dwResult ) {
hResult = HRESULT_FROM_WIN32( ::GetLastError() );
goto err;
}
/*
プロセスの終了コードを取得する
*/
DWORD dwExitCode;
bResult = ::GetExitCodeProcess(
tProcessInfomation.hProcess
, &dwExitCode
);
if ( 0 == bResult ) {
hResult = HRESULT_FROM_WIN32( ::GetLastError() );
goto err;
}
// 終了コードの表示
wprintf( L"dwExitCode = %d¥n", dwExitCode );
err:
// ハンドルの解放
::CloseHandle( tProcessInfomation.hProcess );
::CloseHandle( tProcessInfomation.hThread );
// 正常終了
return( 0 );
}
dwExitCode = 0