将子进程输出重定向到缓冲区 我正在VisualStudioC++中工作。我有子进程输出,需要重定向到某个缓冲区。有人能帮我解决这个问题吗 char ReadBuff[4096 + 1]; DWORD ReadNum; for (;;) { BOOL success = ReadFile(pipes[ParentRead], ReadBuff, sizeof(ReadBuff) - 1, &ReadNum, NULL); std::cout << success; if (!success || !ReadNum) break; ReadBuff[ReadNum] = 0; std::cout << ReadBuff; } charreadbuff[4096+1]; 德沃德·里德纳姆; 对于(;;) { BOOL success=ReadFile(管道[ParentRead],ReadBuff,sizeof(ReadBuff)-1,&ReadNum,NULL); std::cout

将子进程输出重定向到缓冲区 我正在VisualStudioC++中工作。我有子进程输出,需要重定向到某个缓冲区。有人能帮我解决这个问题吗 char ReadBuff[4096 + 1]; DWORD ReadNum; for (;;) { BOOL success = ReadFile(pipes[ParentRead], ReadBuff, sizeof(ReadBuff) - 1, &ReadNum, NULL); std::cout << success; if (!success || !ReadNum) break; ReadBuff[ReadNum] = 0; std::cout << ReadBuff; } charreadbuff[4096+1]; 德沃德·里德纳姆; 对于(;;) { BOOL success=ReadFile(管道[ParentRead],ReadBuff,sizeof(ReadBuff)-1,&ReadNum,NULL); std::cout,c++,winapi,mfc,C++,Winapi,Mfc,这不是我自己的代码,我很久以前就发现了。这里的链接()可能不是原始源代码,所以我也在发布代码 因此,这段代码将运行一个命令并将所有输出放入一个CString,WaitForSingleObject(pi.hProcess,INFINITE);将使主进程挂起,直到子进程完成 //执行命令并在CString中获取结果。 //同步启动一个子进程并等待2秒以完成。 //使用管道获取子进程的输出。 //不通过管道传输到子进程的标准DIN。 //用法示例: //CString-str; //str=Exec

这不是我自己的代码,我很久以前就发现了。这里的链接()可能不是原始源代码,所以我也在发布代码

因此,这段代码将运行一个命令并将所有输出放入一个CString,
WaitForSingleObject(pi.hProcess,INFINITE);
将使主进程挂起,直到子进程完成

//执行命令并在CString中获取结果。
//同步启动一个子进程并等待2秒以完成。
//使用管道获取子进程的输出。
//不通过管道传输到子进程的标准DIN。
//用法示例:
//CString-str;
//str=ExecCmd(“ping 127.0.0.1-n99”);//此ping命令将在-n99完成之前提前终止。
//str.Replace(“\x0d\x0d\x0a”,“\x0d\x0a”);//修复了ping创建的一些难看的非标准线终止符。
//
//str=ExecCmd(“java-version”);//更实用的用法。
//
CString ExecCmd(CString pCmdArg、CString csParameters、CString csDir)
{
//句柄继承-要通过管道将子对象的标准输出传递到父对象,必须继承句柄。
//SECURITY_ATTRIBUTES.bInheritHandle必须为TRUE
//CreateProcess参数bInheritHandles必须为TRUE;
//STARTUPINFO.dwFlags必须设置STARTF_USESTDHANDLES。
CString stresult=L“”;//包含cmdArg的结果。
HANDLE hchildsdutrd;//读取端,用于调用ReadFile()以获取子级的标准输出。
HANDLE hChildStdoutWr;//写端,使用si结构提供给子进程。
成功;
//创建安全属性以创建管道。
安全属性saAttr={sizeof(安全属性)};
saAttr.bInheritHandle=TRUE;//设置bInheritHandle标志,以便子进程继承管道句柄。必需。
saAttr.lpSecurityDescriptor=NULL;
//创建管道以从子对象的标准输出中获取结果。
//我将只创建1,因为我不需要通过管道连接到孩子的stdin。
if(!CreatePipe(&hChildStdoutRd,&hChildStdoutWr,&saAttr,0))
{
返回L“无法创建管道”;
}
STARTUPINFO si;
零内存(&si,sizeof(si));
si.cb=sizeof(si);
处理信息;
零内存(&pi,sizeof(pi));
si.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;//STARTF_USESTDHANDLES是必需的。
si.hStdOutput=hChildStdoutWr;//需要在dwFlags中使用STARTF\u USESTDHANDLES。
si.hStdError=hChildStdoutWr;//需要在dwFlags中使用STARTF\u USESTDHANDLES。
//si.hStdInput保持为空。
si.wShowWindow=SW_HIDE;//防止cmd窗口闪烁。在dwFlags中需要STARTF_USESHOWWINDOW。
CString csCommand(pCmdArg);
csCommand+=L“”;
csCommand+=CSP参数;
//创建子进程。
fSuccess=CreateProcess(NULL,csCommand.GetBuffer(0),NULL,NULL,TRUE,0,NULL,
csDir、si和pi);
//fSuccess=CreateProcess(
//空,
//(LPSTR)pCmdArg,//命令行
//NULL,//进程安全属性
//NULL,//主线程安全属性
//TRUE,//TRUE=继承了句柄。必需。
//创建新控制台,//创建标志
//NULL,//使用父环境
//NULL,//使用父级的当前目录
//&si,//\u英寸,STARTUPINFO指针
//&pi);//\u输出,接收进程信息
如果(!fsucces)
{
返回L“无法创建进程”;
}
//等待子进程退出。
WaitForSingleObject(pi.hProcess,无限);
TerminateProcess(pi.hProcess,0);//如果进程仍在运行,则杀死它。使用cmd“ping blah-n 99”进行测试
//在从管道的读取端读取之前,请关闭管道的写入端。
如果(!CloseHandle(hChildStdoutWr))
{
返回L“无法关闭句柄”;
}
//读取子进程的输出。
对于(;;)
{
德沃德·德雷德;
CHAR-chBuf[4096];
//从作为子进程标准输出的管道中读取。
bool done=!ReadFile(hChildStdoutRd,chBuf,4096,&dwRead,NULL)| dwRead==0;
如果(完成)
{
打破
}
//将结果追加到字符串。
strResult+=CString(chBuf,dwRead);
}
//关闭进程和线程句柄。
关闭手柄(HChildsDoutrd);
//CreateProcess文档指定必须关闭这些文档。
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
返回strResult;
}

您谈论的是“重定向输出”,这通常意味着输出到STDOUT/STDERR。然而,您的代码似乎使用管道。那么,在重定向输出或从管道读取方面,您真正需要什么帮助?如果
成功
为FALSE,则
读取文件()
失败。调用
GetLastError()
找出原因。非常感谢,我找到了答案。我的管道在写入缓冲区之前就已经结束了。我能够获得输出。非常感谢您的回复。谢谢大家。