Tips Win32API

メモの代わりにここに書いておきます。 このページに記載されているソースは自由に使ってもらってかまいませんが、無保証です。

画面に表示させずにDOSコマンドを実行



// ------------------------------------------------------------------
// 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;
}