我使用msdn的“使用重定向输入和输出创建子进程”教程 链接:https://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx
一切正常,父进程显示它完全正确。但是不是从管道中读取它并将其写入Parent STD_OUTPUT_HANDLE,而是想从管道中读取并以变量类型写入输出。
这就是我的意思:
void ReadFromPipe(void)
// Read output from the child process's pipe for STDOUT
// and write to the parent process's pipe for STDOUT.
// Stop when there is no more data.
{
DWORD dwRead, dwWritten;
CHAR chBuf[BUFSIZE];
BOOL bSuccess = FALSE;
HANDLE hParentStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
for (;;)
{
bSuccess = ReadFile( g_hChildStd_OUT_Rd, chBuf, BUFSIZE, &dwRead, NULL);
if( ! bSuccess || dwRead == 0 ) break;
bSuccess = WriteFile(hParentStdOut, chBuf,
dwRead, &dwWritten, NULL);
if (! bSuccess ) break;
}
}
我设法在Writefile函数之后获取chBuf并尝试构建一个字符串,但它包含重复项和字符,我不希望在我的字符串中。所以我的字符串包含比父控制台输出更多的字符。
我的解决方法是将输出保存到文件然后将其流式传输到变量,但该解决方案很糟糕,因为如果您运行我的应用程序的两个实例,我必须管理它以不覆盖其他文件等等越来越复杂,我想要一个更清洁的解决方案
你能帮我解决这个问题吗?
答案 0 :(得分:0)
我设法在Writefile函数之后获取chBuf并尝试构建一个字符串,但它包含重复项和字符,我不希望在我的字符串中。所以我的字符串包含比父控制台输出更多的字符。
最有可能的是,你正在构建你的字符串而忽略dwRead
- 也就是说,你总是假设已经读取了完整的缓冲区 - 或类似的东西。尽管如此,从您正在阅读的数据中构建std::string
实际上非常简单:
std::string ReadFromPipe(void) {
std::string ret;
DWORD dwRead;
CHAR chBuf[BUFSIZE];
BOOL bSuccess = FALSE;
for (;;) {
bSuccess = ReadFile( g_hChildStd_OUT_Rd, chBuf, BUFSIZE, &dwRead, NULL);
if( ! bSuccess || dwRead == 0 ) break;
ret.append(chBuf, dwRead);
}
return ret;
}