On Windows systems you should use named pipes - there is no need to get a handle to the process in that case. One process acts as a server, the other processes connect to the named pipe using CreateFile() (windows treats named pipes like files).
Look up CreateNamedPipe() and ConnectNamedPipe() in msdn. These basically act similar to a windows socket where ConnectNamedPipe() is synonymous with Accept() to wait for connections. Easy to manage if you know only one process is going to connect to it, otherwise you need to manage each connection by creating a new thread for it (or write your code such that it is non-blocking and just calls poll routines for each connection).
If you really need to detect a windowless process, that is a different matter, since enumerating processes is different depending on the windows version, but if you stick to the named pipe method you can connect to the pipe and query the process handle via a message - et voila.
Look up CreateNamedPipe() and ConnectNamedPipe() in msdn. These basically act similar to a windows socket where ConnectNamedPipe() is synonymous with Accept() to wait for connections. Easy to manage if you know only one process is going to connect to it, otherwise you need to manage each connection by creating a new thread for it (or write your code such that it is non-blocking and just calls poll routines for each connection).
If you really need to detect a windowless process, that is a different matter, since enumerating processes is different depending on the windows version, but if you stick to the named pipe method you can connect to the pipe and query the process handle via a message - et voila.