1) Create a mutex, using the name of a restaurant. When a new instance of the application starts, retrieve the list of restaurant names from a shared database, and run through the list of restaurants attempting to obtain a mutex for each one until you get one you are able to obtain. If you cannot obtain any of the mutexes based on the restaurant names, then every restaurant application is already running, so just shut down.
see here:
http://www.codeproject.com/KB/cs/SingleInstanceAppMutex.aspx2) As for sharing the MapPoint activex control in more than one process...it should be easy to figure out if you cannot find any documentation. Create an application with the map point control, and run it twice...look in the task manager and see if the MapPoint process is created twice.
3) When you close your application, go through the mutex process again, and if you are able to obtain every mutex, then your instance is the last instance running...so dispose of the COM object.
4) Use .net remoting to communicate between instances of your application. Register the channels using the restaurant name, then you can communicate with every other restaurant application intance on the channel that matches the restaurant name.
see here:
http://www.codeproject.com/KB/IP/remotingchatsample.aspx