我有一个Namedpipeserver写在很大程度上基于:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365588(v=vs.85).aspx
当我尝试使用此代码从.NET客户端连接到它时:
NamedPipeClientStream clientPipe = new NamedPipeClientStream(".", "\\\\.\\pipe\\TTCUIHELPER_SEND_TTC_RECEIVE",PipeDirection.Out); try { if (clientPipe != null) { clientPipe.Connect(5000); if (clientPipe.IsConnected == true) { byte[] bytes = pm.GetMessageData(); clientPipe.Write(bytes, 0, bytes.Length); clientPipe.Flush(); clientPipe.Dispose(); clientPipe.Close(); } } } catch (Exception Ex) { System.Windows.MessageBox.Show(Ex.Message); }
然后连接总是超时。 奇怪的是,如果我尝试使用CPP编写testing客户端,那么:
LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\TTCUIHELPER_SEND_TTC_RECEIVE"); const TCHAR* lpvMessage=L"QQQQ"; HANDLE hPipe = CreateFile( lpszPipename, // pipe name GENERIC_READ | // read and write access GENERIC_WRITE, 0, // no sharing NULL, // default security attributes OPEN_EXISTING, // opens existing pipe 0, // default attributes NULL); // no template file // Break if the pipe handle is valid. DWORD cbWritten; DWORD cbToWrite = (lstrlen(lpvMessage)+1)*sizeof(TCHAR); _tprintf( TEXT("Sending %d byte message: \"%s\"\n"), cbToWrite, lpvMessage); BOOL fSuccess = WriteFile( hPipe, // pipe handle lpvMessage, // message cbToWrite, // message length &cbWritten, // bytes written NULL); // not overlapped if ( ! fSuccess) { _tprintf( TEXT("WriteFile to pipe failed. GLE=%d\n"), GetLastError() ); return -1; }
那完美的作品。 我可以做什么错误,它从CPP,但不是.NET的作品?
只需从管道名称中丢失管道前缀,即只使用名称本身:
"TTCUIHELPER_SEND_TTC_RECEIVE"
.NET NamedPipeClientStream
类在内部调用Windows WriteFile API时为您添加前缀。