Listing 1: Creating and connecting instances of a named pipe
// Create all instances of the named pipe. // for (dwIndex=0; dwIndex < dwNumPipeInstances; dwIndex++) { // Create named pipe. Note: in case of failure, the handle // is INVALID_HANDLE_VALUE, *not* NULL. // m_ahPipes[dwIndex] = CreateNamedPipe( m_achPipeName, // pointer to pipe name PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED , // mode PIPE_TYPE_BYTE | PIPE_WAIT, // pipe-specific modes dwNumPipeInstances, // maximum number of instances 4096, // output buffer size, in bytes 4096, // input buffer size, in bytes 0, // default time-out time, in milliseconds &secattrSA // pointer to security attributes structure ); // if ( INVALID_HANDLE_VALUE == m_ahPipes[dwIndex] ) { THROW_WIN32_EXCEPTION ; } } // // End for-loop creating named pipes // Now connect all named pipes asynchronously. This is // done in a separate for-loop, because we don't want // any clients to connect until we know all pipe instances // have been created successfully. // for (dwIndex=0; dwIndex < dwNumPipeInstances; dwIndex++) { // Create overlapped event for named pipe connection // m_ahOlEventsAndExitEvent[dwIndex] = CreateEvent( NULL, // pointer to security attributes TRUE, // flag for manual-reset event FALSE, // flag for initial state NULL // pointer to event-object name ); // if ( NULL == m_ahOlEventsAndExitEvent[dwIndex] ) { THROW_WIN32_EXCEPTION ; } // Connect the instance of the pipe asynchronously, // using the event as overlapped event. Note: the function // returns FALSE in two cases that aren't really errors. // ERROR_PIPE_CONNECTED means a client has already snatched // the pipe. ERROR_IO_PENDING means that the asynchronous // call was successful, but no client has connected yet. // m_aOverlapped[dwIndex].hEvent = m_ahOlEventsAndExitEvent[dwIndex] ; bRetVal = ConnectNamedPipe( m_ahPipes[dwIndex], // handle to named pipe to connect &m_aOverlapped[dwIndex] // &overlapped structure ) ; // if ( ! bRetVal && ERROR_IO_PENDING != GetLastError() && ERROR_PIPE_CONNECTED != GetLastError() ) { THROW_WIN32_EXCEPTION ; } } // // End for-loop connection named pipes //End of File