Your code is dealing with COM interface pointer living in current apartment. You are aware about COM initialization already, so current apartment means current thread if you are in STA in particular. You are guaranteed that methods of the interface pointer are callable but the back end of this interface pointer might vary: it can be implementation directly, or it can be a helper object (proxy) which transfers the call into the apartment where the actual object resides. The latter in particular might be in another process.
This is all thread safe and "process safe". The parameters are taken with the call to the actual object and then transferred back. Caller don't have to care whether it's dealing with real object or a proxy, and the callee too does not need to know whether it's called by actual caller or a helper stub.
Having said that, the code snippet above is good. The crash you were having has to have another cause.