[英]No bytes in named pipe
服務:在命名管道中創建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)
我刪除了周圍的代碼,以確保句柄有效並且進程正在運行等等。
窺視顯示ulRemainingBytes
始終為 0
。 有人看到我的錯誤可能在哪里嗎? 我一直在努力使它工作一段時間,並且不知道什么合適的標志了。 請詢問您是否需要更多信息!
CreateNamesPipe中的安全屬性是從方法生成的。 它在代碼中的許多其他地方都使用過,所以我不認為問題出在那。
謝謝。
PeekNamedPipe()
返回應該檢查的BOOL
。
如果失敗( FALSE
或0
),請使用GetLastError()
找出原因。
在此之前,您還應該對照INVALID_HANDLE_VALUE
檢查CreateFile()
( hStdOutPide
)的返回值。 如果返回的句柄無效,則很可能是PeekNamedPipe()
失敗的原因。
總而言之,您似乎獲得了太多(好)結果。 別! 檢查您的返回碼,永遠不要依靠運氣。
只是一件事:共享標志設置有可能不正確。 確保它們不與您要執行的操作沖突。 無論哪種方式,如果CreateFile()
失敗, GetLastError()
都會再次告訴您有關此類問題的信息。
我懷疑您是在嘗試從子進程讀取stdout而不是stdin。 但是從有限的代碼我無法確認這一點。 有關使用管道的IPC,請參閱此問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.