先上代码: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内部代码中中断了一样)?
{
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内部代码中中断了一样)?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货