我一直在做大量的搜索,仍然似乎無法弄清楚如何解決我的問題。我正在編寫一個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