Global Interface Table
The global interface table (GIT) is a process-wide object where you can register interfaces that live in different apartments. Some of them may aggregate the free-threaded marshaler and some may not, it’s all good. The GIT handles the marshaling correctly in both cases.
Instead of calling CoMarshalInterThreadInterfaceInStream and CoGetInterfaceAndReleaseStream, it’s usually simpler and less error-prone to register/unregister the objects in the GIT. You access it over the IGlobalInterfaceTable interface, which is provided by the system.
IGlobalInterfaceTable* m_pGIT;
CoCreateInstance(CLSID_StdGlobalInterfaceTable, NULL,
CLSCTX_INPROC_SERVER, IID_IGlobalInterfaceTable,
(void**)&m_pGIT);
...
DWORD m_cookie;
m_pGIT->RegisterInterfaceInGlobal(pMyInterface,
IID_IMyInterface, &m_cookie);
// Possibly called by a client thread in another apartment
m_pGIT->GetInterfaceFromGlobal(m_cookie, IID_IMyInterface,
(void**)&pMyInterface);
// Use pMyInterface here.
pMyInterface->Release();
...
m_pGIT->RevokeInterfaceFromGlobal(m_cookie);
// Now release the GIT.
m_pGIT->Release();