You don't really divide the application into multiple ones, you just use a very simple guardian process that calls things that can potentially hang or die (like activex objects like excel or adobe reader) that you can easily so that crashes at least don't crash the main app.
In our case, we used simple shared memory that contained all memory to initialize the new read into Excel, and in a different case (an ISAPI dll that tended to die because of connection with a dodgy activex object) we started a service with a all crucial state of the ISAPI dll, and the isapi DLL would use and update it.
If it would die, the service would simply respawn the process that would use the state from shared memory to (mostly) continue where it died.
As said, I don't have any code anymore, I can only recommend shared memory as a IPC method because that way it is easy to implement a state machine and pass simple data.