Well, in case anyone stumbles across this post, I thought I'd let you know how I solved my problem (well, this one anyway)... Turns out a pluggable protocol is the solution. The basics are easy to write and, critically, they can be registered on a per-process basis. I invented my own URL scheme, implemented an APP for it, registered my APP class factory using CoInternetGetSession and IInternetSession::RegisterNameSpace and away I went. The UI is now "served" via my own URL scheme by my own APP on a per-process basis.