【发布时间】:2015-03-27 16:27:32
【问题描述】:
我使用CreateProcess() 向 cmd.exe 运行命令。该命令本身具有无限输出,因此我使用从this answer 修改的函数将部分输出转换为字符串。
#define BUFSIZE 4096
HANDLE g_hChildStd_OUT_Rd = NULL;
std::string ReadFromPipe(PROCESS_INFORMATION piProcInfo) {
DWORD dwRead;
CHAR chBuf[BUFSIZE];
ReadFile( g_hChildStd_OUT_Rd, chBuf, BUFSIZE, &dwRead, NULL);
std::string s(chBuf, dwRead);
return s;
}
但是这段代码会产生一些问题。
首先,每次我调用它时,它可能会在等待输出缓冲到 4096 字节时冻结程序。
其次,它总是只会得到输出队列中接下来的 4096 个字节。 (即使当前输出大很多)
我想要的是调用该函数并获取同时输出的所有数据,并且还能够设置要获取的最小字节数(而不是缓冲区)。如果最小字节数尚不可用,我希望它完全跳过ReadFile(),只返回false。 (而不是冻结应用程序)
这可能吗?
【问题讨论】:
-
很好的链接。谢谢你。 :)
-
它不应该等待所有 4096 个字节。只要至少有一个字节可用,它就应该返回。你确定这个问题真的存在吗?注意你必须检查错误返回。
-
这可能是因为我正在构建一个 FireBreath 项目,并且我正在从浏览器调用 C++ 函数,所以它也可能会冻结,因为浏览器在获得返回值之前无法继续。但我确信该函数会一直等到它获取整个缓冲区,然后才返回该值。我的回答完全解决了这个问题。
标签: c++ visual-studio-2012 readfile