Несколько простых фрагментов от клиента (вашего сервиса) и сервера (уведомителя)
[ Примечание: это адаптировано из проекта, который я делал недавно, на который, в свою очередь, оказали сильное "влияние" образцы MSDN из CreateNamedPipe & co ]:
Серверная сторона:
HANDLE hPipe = INVALID_HANDLE_VALUE;
bool bConnected = false;
hPipe = CreateNamedPipe( L"\\\\.\\pipe\\nhsupspipe",
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
PIPE_UNLIMITED_INSTANCES,
sizeof( Message ),
0,
0,
NULL );
// failed to create pipe?
if( hPipe == INVALID_HANDLE_VALUE ){
return -1;
}
// Wait for the client to connect; if it succeeds,
// the function returns a nonzero value. If the function
// returns zero, GetLastError returns ERROR_PIPE_CONNECTED.
bConnected = ConnectNamedPipe( hPipe, NULL ) ? true : ( GetLastError() == ERROR_PIPE_CONNECTED );
if( bConnected ){
while( true ){
unsigned long ulBytesRead = 0;
// read client requests from the pipe.
bool bReadOk = ReadFile( hPipe,
&message,
sizeof( message ),
&ulBytesRead,
NULL );
// bail if read failed [error or client closed connection]
if( !bReadOk || ulBytesRead == 0 )
break;
// all ok, process the message received
}
}
else{
// the client could not connect, so close the pipe.
CloseHandle( hPipe );
}
return 0;
Клиент:
HANDLE hPipe = INVALID_HANDLE_VALUE;
// create the named pipe handle
hPipe = CreateFile( L"\\\\.\\pipe\\nhsupspipe",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL );
// if everything ok set mode to message mode
if( INVALID_HANDLE_VALUE != hPipe ){
DWORD dwMode = PIPE_READMODE_MESSAGE;
// if this fails bail out
if( !SetNamedPipeHandleState( hPipe, &dwMode, NULL, NULL ) ){
CloseHandle( hPipe );
return -1;
}
}
unsigned long ulBytesWritten = 0;
bool bWriteOk = WriteFile( hPipe,
( LPCVOID )&message,
sizeof( Message ),
&ulBytesWritten,
NULL );
// check if the writing was ok
if( !bWriteOk || ulBytesWritten < sizeof( Message ) ){
return -1;
}
// written ok
return 0;
Сообщение , упомянутое выше, является структурой, которая будет вашим сообщением, которое вы, вероятно, захотите упаковать .
Поскольку в вашем сценарии клиент (служба), вероятно, будет запущен и запущен до того, как сервер (уведомитель) вам понадобится внедрить некую стратегию переподключения на стороне клиента.
И на несколько другой ноте вы должны внимательно рассмотреть то, что сказал г-н Остерман в своем ответе (хотя бы потому, что он Ларри Остерман).