2013-08-28 123 views
0

我目前正在處理充當命名管道服務器的應用程序。此應用程序僅用於將數據發送給客戶端(不是我寫的),但也需要告知管道何時損壞。我對此任務的想法是使用GetNamedPipeHandleState()來檢索管道實例的數量,並查看管道是否仍駐留在系統中。如果它不再連接,程序將重新設置管道,以便客戶端可以重新連接並從應用程序中恢復提取數據。不幸的是,我無法檢索管道實例的數量。每次撥打電話時,該功能都會失敗,GetLastError()返回ERROR_ACCESS_DENIED命名管道服務器無法獲取管道狀態

GetNamedPipeHandleStateA(pipe,0,&npipeinstances,0,0,0,0); 

如果我調用該函數是這樣的::

GetNamedPipeHandleStateA(pipe,0,0,0,0,0,0); 

沒有錯誤發生,但我沒有收到任何狀態信息。然而,如果我試圖調用如下才會出現這種情況。是否有可能缺失的創建參數,或者檢查此信息的更好方法?

用於管道的創建代碼如下:

pipe=CreateNamedPipeA(pipename,    // name of the pipe 
         PIPE_ACCESS_OUTBOUND, // read/write access 
         PIPE_TYPE_MESSAGE | // message type pipe 
         PIPE_WAIT,   // blocking mode 
         1,     // max. instances 
         65535,    // output buffer size 
         65535,    // input buffer size 
         300,     // client time-out 
         NULL);    // default security attribute 
+0

那麼,如果你用所有參數[除了句柄]零調用它,它可能會跳過你用'&npipeinstances'調用時給你ERROR_ACCESS_DENIED的檢查。 –

+0

@Mats這仍然留下如何解決問題的主要問題。我可能通過檢查WriteFile的返回來破解它,但即使沒有要寫入的數據(它跳過WriteFile調用),我也需要執行檢查。這似乎是進行檢查的最佳方式,除非我錯過了API中的某些內容。 – Alex

+0

這只是錯誤的做法。破損的管道是一個重大的事故,你可以「重新連接」到同一個客戶端實例的機率是zilch。您在ReadFile()調用失敗時找出它。您應該始終有一個掛起,以便您可以快速響應客戶端發送。所以不需要單獨進行輪詢。 –

回答

0

API docs

hNamedPipe [in]一個手柄到命名管道的信息所在 想要的。該句柄必須具有GENERIC_READ訪問權限,用於只讀管道或 讀/寫管道,或者必須具有對只寫管道的GENERIC_WRITE和 FILE_READ_ATTRIBUTES訪問權限。

如果你已經打開你的管柄(pipe)只有PIPE_ACCESS_OUTBOUND,我不認爲你滿足這個條件。因此ERROR_ACCESS_DENIED錯誤。