kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

プロセスハンドルの有効期限

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にもしっかり書かれています)。
しょうがないから判定用のスレッドを作りました…。