2011-10-21 44 views
2

服務: 在命名管道中創建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中的屬性是從一個方法生成的。它在代碼中的許多其他地方使用,所以我不相信問題在那裏。

謝謝。

回答

1

PeekNamedPipe()返回應該檢查的BOOL

如果失敗(FALSE0),請使用GetLastError()找出原因。

而在此之前,您還應該檢查返回值CreateFile()hStdOutPide)與INVALID_HANDLE_VALUE。如果返回的句柄無效,可能是導致PeekNamedPipe()失敗的原因。

總而言之,您似乎需要採取太多(良好)的結果。別!檢查你的返回碼,永遠不要依靠運氣。

還有一件事:有可能是共享標誌設置不正確。確保它們與你想要做的事不衝突。無論哪種方式,GetLastError()將再次告訴你有關這種問題,以防CreateFile()失敗。

+0

我使用的是開關的情況下爲GetLastError函數()的PeekNamedPipe後處理所有可能的值是指對這個問題的IPC使用管道。 我正在檢查INVALID_HANDLE_VALUE的CreateFile的返回值。感謝提示,但我不會發布在stackoverflow,如果我沒有被困在這一段時間。 –

+0

@Padawan學習者:你看到什麼錯誤?因爲你描述的行爲表明一個錯誤,你的代碼沒有足夠的錯誤檢查。 – 0xC0000022L