服務: 在命名管道中創建std out,err。將它們附加到它創建的過程。命名管道中沒有字節
HANDLE hStdOut = CreateNamedPipe(szStdOutPipeName,
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_BYTE,
1,
100,
100,
15000,
pSa);
yStartupInfo.hStdOutput = hStdOut;
CreateProcessAsUserW(..., yStartupInfo, ...);
這部分工作。創建的進程的輸出正被重定向到管道中。
客戶端: 連接到命名管道,成功。檢查是否有字節需要閱讀(此時字節被壓入管道!)。然後從管道讀取字節。
hStdOutPide = CreateFileW(szPipeNameStdOut,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
PeekNamedPipe(hStdOutPide,
szBuffer,
kunBufferSize,
&ulBytesRead,
&ulBytesAvailable,
&ulRemainingBytes);
if(ulBytesAvailable > 0)
ReadFile(hStdOutPide, szBuffer, 1000, &ulBytesRead, NULL)
我已經刪除了確保句柄有效並且進程正在運行等的代碼。
The Peek揭示ulRemainingBytes
是總是0
。有沒有人看到我的錯誤可能是哪裏?我一直試圖讓這個工作一段時間,不知道什麼是適當的標誌是什麼了。請詢問您是否需要更多信息!
安全CreateNamesPipe中的屬性是從一個方法生成的。它在代碼中的許多其他地方使用,所以我不相信問題在那裏。
謝謝。
我使用的是開關的情況下爲GetLastError函數()的PeekNamedPipe後處理所有可能的值是指對這個問題的IPC使用管道。 我正在檢查INVALID_HANDLE_VALUE的CreateFile的返回值。感謝提示,但我不會發布在stackoverflow,如果我沒有被困在這一段時間。 –
@Padawan學習者:你看到什麼錯誤?因爲你描述的行爲表明一個錯誤,你的代碼沒有足夠的錯誤檢查。 – 0xC0000022L