メモの代わりにここに書いておきます。 このページに記載されているソースは自由に使ってもらってかまいませんが、無保証です。
// ------------------------------------------------------------------
// ConsolExec
// コンソール指向なexecを実行する
// CHAR *strCom DOSコマンドの文字列
// 成功したらTRUE/失敗したらFALSE
// ------------------------------------------------------------------
BOOL ConsolExec( CHAR *strCom )
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
SECURITY_ATTRIBUTES sa;
DWORD dwExitCode;
DWORD dwRet;
HANDLE hProc;
CHAR strPath[ MAX_PATH ];
CHAR strCmd[ MAX_PATH ];
CHAR strExec[ MAX_PATH ];
BOOL bRet;
// 環境変数COMSPECの文字列を取得
GetEnvironmentVariable( "COMSPEC" , strCmd , sizeof(strCmd) );
// CreateProcessに渡せる"cmd.exe /c xxxxxx"or"command.com /c xxxxxx"の形を作成
wsprintf( strExec , "%s /c %s" , strCmd , strCom );
// SECURITY_ATTRIBUTES 構造体の設定
memset( &sa , 0 , sizeof( SECURITY_ATTRIBUTES ) );
sa.nLength = sizeof( SECURITY_ATTRIBUTES );
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;// ハンドルを継承する
// STARTUPINFO 構造体の設定
memset( &si , 0 , sizeof( STARTUPINFO ) );
si.cb = sizeof( STARTUPINFO );
si.lpDesktop = NULL;
si.lpTitle = NULL;
si.dwFlags = STARTF_USESHOWWINDOW;//STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdInput = NULL;// ここを自前で指定すれば出力結果を得られる
si.hStdOutput = NULL;//
si.hStdError = NULL;//
// 現在のディレクトリパスを取得
GetCurrentDirectory( sizeof(strPath) , strPath );
// 別プロセスで実行させる
if( CreateProcess( NULL , strExec , NULL , NULL , FALSE , 0 , NULL , NULL , &si , &pi ) == FALSE ){
// エラー発生
LPVOID lpMsgBuf;
// エラー内容の表示
dwRet = GetLastError();
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL , dwRet, LANG_USER_DEFAULT, (LPTSTR)&lpMsgBuf , 0, NULL );
MessageBox( NULL , (LPTSTR)lpMsgBuf , "Error" , MB_OK|MB_ICONINFORMATION );
bRet = FALSE;
}else{
// 正常
hProc = pi.hProcess;
// コマンド終了まで待つ、n秒以内に終了しないと強制終了させる。INFINITEはずっと待つ
if( WaitForSingleObject( hProc , INFINITE ) == WAIT_FAILED ){
GetExitCodeProcess( hProc , &dwExitCode );
}
bRet = TRUE;
}
// ハンドル開放
if( hProc ){
CloseHandle( hProc );
hProc = NULL;
}
return bRet;
}
|