void foo(void) { STARTUPINFO startInfo; PROCESS_INFORMATION ps; SecureZeroMemory(&startInfo, sizeof(STARTUPINFO)); SecureZeroMemory(&ps, sizeof(PROCESS_INFORMATION)); startInfo.cb = sizeof(STARTUPINFO); TCHAR szCmdLine[_MAX_PATH] = _T("notepad.exe"); BOOL fRet = CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &startInfo, &ps); if(fRet == FALSE) { _tprintf(_T("Error:%ld\n"), GetLastError()); } WaitForSingleObject(ps.hProcess, INFINITE); HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, ps.dwProcessId); if(hProcess) { // ここは通るか? _tprintf(_T("Enable %lx\n"), hProcess); } }
プロセスの生死判定を簡単にOpenProcess()でやろうとして、(私が)ミスったというお話です。このサンプルはUnicodeでもANSIでもコンパイルできるはずです。UnicodeモードではCreateProcess(正確にはCreateProcessW())の第二引数は読み書き可能なメモリを渡さなくてはなりません。文字定数を渡すと、Access Violationになります(MSDNにもしっかり書かれています)。
しょうがないから判定用のスレッドを作りました…。