HRESULT CoMarshalInterThreadInterfaceInStream(
REFIID riid,
LPUNKNOWN pUnk,
LPSTREAM *ppStm);
Quite possibly the longest function name in the
Win32 SDK. The purpose of CoMarshalInterThreadInterfaceInStream is to easily and reliably
marshal COM interface pointers between
threads. The
stream returned in ppStm is guaranteed to behave correctly when a client running in the receiving thread attempts to unmarshal the pointer. The client can then call the
CoGetInterfaceAndReleaseStream to unmarshal the interface pointer and release the
stream object.
Not using this function is probably one of the
greatest pitfalls in multithreaded COM programming. In my experience, if you don't use it, you're asking for trouble. It will create a
scenario where some of your objects work fine between threads, and others just don't. COM will do things like mysteriously, and without
warning, drop your method calls.