2013-06-09 1 views
0

나는 다음과 같은 코드 조각이 :설정 명명 된 파이프 메시지 모드

//... 
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'에 대한 호출이 실패한다는 것입니다 : 결과는 거짓과 GetLastError() 5 (ERROR_ACCESS_DENIED)를 반환합니다. 그 외에는 파이프가 잘 작동합니다. 데이터를 읽고 쓸 수 있습니다. 물론 메시지 모드에서 작동하지 않는 것을 제외하고는 - 예를 들어. 하나의 ReadFile 호출로 두 개의 WriteFile 메시지 호출 내용을 읽습니다. 여기서 내가 뭘 잘못하고 있니?

답변

1

CreateFile은 이미 파이프 서버 역할을하는 다른 사람이 만든 명명 된 파이프의 클라이언트 쪽을 엽니 다. 우리는 당신의 파이프가 어떻게 생성되었는지에 관해서는 질문하지 않습니다. 파이프가 파이프 서버에 의해 작성 될 때 PipeModePIPE_TYPE_MESSAGE으로 지정된 경우 파이프는 메시지 모드에서만 작동합니다.

파이프가 메시지 모드로 작성된 경우 파이프 클라이언트는 메시지 모드 또는 바이트 모드로 읽는지 여부를 선택할 수 있습니다. 파이프가 메시지 모드가 아니면 파이프 클라이언트가 파이프 모드를 변경하지 않으므로 파이프 클라이언트가 읽기 모드를 메시지 (PIPE_READMODE_MESSAGE)로 설정하려고 시도하지 않습니다.

당신은 또한 당신의 NativeMethods을 구현하지만 CreateFile 매개 변수는 Win32 CreateFile 함수의 인수에 직접 매핑하는 경우, 당신은 당신의 파이프 핸들 FILE_READ_DATAFILE_WRITE_DATA 액세스 권한을 요청하는 방법을 우리에게 보여주지 않습니다. 이러한 권한으로는 액세스 거부 오류에 대해 설명하는 SetNamedPipeHandleState에 전화 할 수 없습니다. the Win32 API documentation 참조 :

핸들은 쓰기 전용에 대한 명명 된 파이프에 GENERIC_WRITE 액세스 할 수 없거나/쓰기 파이프를 읽거나이 GENERIC_READ와 읽기 전용 파이프 FILE_WRITE_ATTRIBUTES 액세스 권한이 있어야합니다.

+0

나는 파이프가 메시지 모드에서 Hans Passant (삭제 된)의 답변에 주석으로 작성되었다고 이미 썼습니다. 나는 FileAccess.ReadWrite가 GENERIC_READ | GENERIC_WRITE와 같은 것으로 번역 할 것이라고 생각했지만 (당신이 지적했듯이) 그 경우는 아니었다. –