我一直在做大量的搜索,仍然似乎无法弄清楚如何解决我的问题。我正在编写一个GUI程序(在WinAPI中,所以不需要MFC)与另一个程序(基于命令行)进行通信。我使用匿名管道,因为一切都是本地的(但也许命名管道会更好?),然后我使用CreateProcess();运行我试图从中获取输出的程序。帮助异步I/O
现在,我刚刚从几小时前的同步转移到异步,并且遇到了一些问题(即使同步没有做我想要的东西)。第一个问题是我在运行同步I/O时仍遇到同样的问题;如果我运行我的“读取”(或“写入”)功能不止一次,程序将冻结。我不能这样做,因为程序的目的是定期更新GUI到命令提示符的输出。
第二个问题,最终更严重的是一个新的异步I/O;它不像我的同步一样读取整个输出。它读取,直到我正在阅读的程序发送返回字符(否则,它恰好是巧合,这是它停止阅读的点)。我觉得我可能不完全理解OVERLAP的功能,但是现在我正在阅读如此多的MSDN,因此我可能忽略了一些重要的方面。
所以基本上,下面的代码是我正在做的最低限度。我曾尝试使用各种for()和while()循环技术来尝试获取所有输出数据,但它似乎是不行的。请注意,BUFSIZE定义在0x1000,这实际上比我为这个需求编写的小测试程序还要多。
::ReadFile(_hChild_Out_Rd, chBuf, BUFSIZE, &dwRead, &o1);
chBuf[dwRead] = '\0';
::SetDlgItemTextA(global,IDO_WORLDOUT,chBuf);
那么,有没有人有任何想法?
非常感谢您的帮助!
问候,
丹尼斯M.
我现在唯一的问题是如何将流程写入命名管道?我创建了一个名称管道,并尝试以与匿名管道相同的方式运行一个进程,但无法访问输出。有任何想法吗? – RageD 2010-07-11 06:16:00
匿名教皇应该为此目的而工作得很好,但是如果您想使用命名管道,请注意您必须单独打开两端(并且两端都是双向的),不像匿名情况下您得到一对手柄通过单个API调用到单向管道的末端。 – 2010-07-11 11:56:31
执行'CreatePipe()'返回的文件句柄,甚至是否设置了'FILE_FLAG_OVERLAPPED'? 'CreatePipe()'没有“文件模式”或“打开模式”参数。 – bk1e 2010-07-11 16:28:52