簡體   English   中英

設置命名管道消息模式

[英]set named pipe message mode

我有以下代碼:

//...
SafeFileHandle handle = NativeMethods.CreateFile(pipeName, FileAccess.ReadWrite, FileShare.None, IntPtr.Zero, FileMode.Open, FileAttributes.Normal, IntPtr.Zero);
if (handle.IsInvalid)
    continue;
uint mode = (uint)PipeMode.ReadModeMessage; // mode==2
bool result = NativeMethods.SetNamedPipeHandleState(handle, ref mode, IntPtr.Zero, IntPtr.Zero);
//...

問題是對“ SetNamedPipeHandleState”的調用失敗:結果為false,GetLastError()返回5(ERROR_ACCESS_DENIED)。 除此之外,管道還可以正常工作-我可以讀寫數據。 當然,除了它不在消息模式下工作-例如。 兩個WriteFile消息調用的內容由單個ReadFile調用讀取。 我在這里做錯了什么?

CreateFile打開已由其他人作為管道服務器創建的命名管道的客戶端。 您沒有在問題中告訴我們如何創建管道。 如果在管道服務器創建管道時將PipeMode指定為PIPE_TYPE_MESSAGE ,則管道將僅在消息模式下工作。

如果管道是在消息模式下創建的,則管道客戶端可以選擇是以消息模式還是字節模式進行讀取。 如果管道不在消息模式下,則管道客戶端不會嘗試將讀取模式設置為消息( PIPE_READMODE_MESSAGE ),因為它不會更改管道模式,因此不會起作用。

您也沒有向我們展示如何實現NativeMethods ,但是,如果將CreateFile參數直接映射到Win32 CreateFile函數的參數,則僅要求管道句柄具有FILE_READ_DATAFILE_WRITE_DATA訪問權限。 這些權限不足以允許您調用SetNamedPipeHandleState ,它說明了拒絕訪問錯誤。 請參閱Win32 API文檔

對於只讀或讀/寫管道,句柄必須具有對命名管道的GENERIC_WRITE訪問,或者對於只讀管道,句柄必須具有GENERIC_READ和FILE_WRITE_ATTRIBUTES訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM