我在Windows服务中创build了一个NamedPipe并手动启动服务,或者在系统启动时启动。
编辑:
lpszPipename = TEXT("\\\\.\\pipe\\1stPipe"); OVERLAPPED m_OverLaped; HANDLE hEvent; hPipe=CreateNamedPipe (lpszPipename, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_NOWAIT, PIPE_UNLIMITED_INSTANCES,BUFSIZE, BUFSIZE,0,NULL); m_OverLaped.hEvent=CreateEvent(NULL,TRUE,TRUE,NULL); m_OverLaped.Internal=0; m_OverLaped.InternalHigh=0; m_OverLaped.Offset=0; m_OverLaped.OffsetHigh=0; ConnectNamedPipe(hPipe,&m_OverLaped);
现在我想访问命名pipe道,写一些消息和回应。
LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\1stPipe"); OVERLAPPED m_OverLaped; m_OverLaped.hEvent=CreateEvent(NULL,TRUE,TRUE,NULL); m_OverLaped.Internal=0; m_OverLaped.InternalHigh=0; m_OverLaped.Offset=0; m_OverLaped.OffsetHigh=0; hPipe=CreateFile (lpszPipename, // Gets the Pipename GENERIC_READ | GENERIC_WRITE,// Client only writes to this pipe. 0, // Do not share this pipe with others. NULL, // Do not inherit security. OPEN_EXISTING, // Pipe must exist. FILE_ATTRIBUTE_NORMAL, // I have no special requirements on //file attributes NULL); dwMode = PIPE_READMODE_MESSAGE; fSuccess = SetNamedPipeHandleState (hPipe, // pipe handle &dwMode, // new pipe mode NULL, // don't set maximum bytes NULL); // don't set maximum time fSuccess = TransactNamedPipe (hPipe, // pipe handle lpszWrite, // message to server (lstrlen(lpszWrite)+1)*sizeof(TCHAR),//message length chReadBuf, // buffer to receive reply BUFSIZE*sizeof(TCHAR), // size of read buffer &cbRead, // bytes read &m_OverLaped); fSuccess = ReadFile (hPipe, // pipe handle chReadBuf, // buffer to receive reply BUFSIZE*sizeof(TCHAR), // size of buffer &cbRead, // number of bytes read &m_OverLaped); // overlapped
我已经忽略了错误检查代码在这里是可读的。 我在执行TransactNamedPipe
时遇到了很长时间(无限可能)的时间。 我必须设置一些参数错误,但我已经尝试了MSDN中指定的选项。
m_OverLaped.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); ... ConnectNamedPipe(hPipe,&m_OverLaped);
由于管道是使用FILE_FLAG_OVERLAPPED标志创建的,因此必须将LPOVERLAPPED参数传递给每个管道I / O调用(包括TransactNamedPipe)。 如果函数返回FALSE并且GetLastError返回ERROR_IO_PENDING,则等待m_OverLaped.hEvent – 设置后,操作完成。
对于初学者
m_OverLaped.hEvent=hPipe;
是错误的,hEvent需要设置为你创建的事件,而不是管道。 在阅读之前,您需要打电话给:
WaitForSingleObject( oOverlap.hEvent,
接着:
GetOverlappedResult()
你有没有在重叠模式下工作的管道?