先上代码:BOOL CDGClientPublishDlg::ExecProgram(const char *szExecuteCmd)
{
    CString strCommand = "";
    SECURITY_ATTRIBUTES sa;
    HANDLE hRead, hWrite;    // 将相对路径转换为绝对路径
    GetCurrentDirectory(_MAX_PATH, strCommand.GetBuffer(_MAX_PATH));
    strCommand.ReleaseBuffer();
    strCommand += "\\";
    strCommand += szExecuteCmd;    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor = NULL;
    sa.bInheritHandle = TRUE;    // 创建管道
    if (!CreatePipe(&hRead, &hWrite, &sa, 0))
    {
        return FALSE;
    }    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    si.cb = sizeof(STARTUPINFO);
    GetStartupInfo(&si);
    si.hStdError = hWrite;  //把创建进程的标准错误输出重定向到管道输入
    si.hStdOutput = hWrite; //把创建进程的标准输出重定向到管道输入
    si.wShowWindow = SW_HIDE;
    si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;    if (!CreateProcess(NULL, strCommand.GetBuffer(), NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi) && m_bNotifyThreadExit.GetVaule() == FALSE)
    {
        CloseHandle(hWrite);
        CloseHandle(hRead);
        return FALSE;
    }    CloseHandle(hWrite);    char buffer[READ_BUFFER_LEN] = {0};
    DWORD bytesRead;    // 读取进程输出
    while (m_bNotifyThreadExit.GetVaule() == FALSE)
    {
        ZeroMemory(buffer, READ_BUFFER_LEN);        if (ReadFile(hRead, buffer, READ_BUFFER_LEN - 1, &bytesRead, NULL) == 0 || bytesRead == 0) {
            break;
        }        m_StrLog += buffer;
        // 将文本显示到编辑框中
        UpdateEditShowText(buffer);
    }
    ...............
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    CloseHandle(hRead);CloseHandle(hWrite);我的问题在这句代码上,为什么我CreateProcess后必须关闭这个句柄,假如不在CreateProcess后关闭而是放到与CloseHandle(hRead);一起关闭则会出问题(问题现象是:多次执行几个命令后,调用ReadFile会终止并且ReadFile也不返回,像是在ReadFile内部代码中中断了一样)?