メモの代わりにここに書いておきます。 このページに記載されているソースは自由に使ってもらってかまいませんが、無保証です。
// ------------------------------------------------------------------ // 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; } |