It turns out that you cannot use COM server running in one session from COM client in other session.
Also you cannot use COM server from other user when you use No registry COM approach.
What can you do ?
One solution is to marshal and unmarshal interface in a global memory.
If you can read russian you can read it here and if you don’t read russian here
In short the approach is simple: It creates a global shared memory with access to all, calls CoMarshalInterface in the server side, then in the client side it calls CoUnmarshalInterface and retrieves IClassFactory.
This should work for multiple users and sessions. But requires some code change, you cannot call the regular CoCreateInstance.
The other solution is to use Session Monikers, but it works only for Windows 2000 and above, of course you do not have sessions in Windows 9x so don’t panic
In this approach you can specify a specific session which you are interested in.
The last stage is to make this shitness work.
Enjoy with COM.