CoMarshalInterThreadInterfaceInStream FinalRelease not called
I've created an object that marshals an interface with
CoMarshalInterThreadInterfaceInStream/CoGetInterfaceAndReleaseStream. The
interface pointer is working as intended but my FinalRelease is not being
called. Here is a sample of what I am doing.
unsigned __stdcall CEngineObj::AnalysisThreadProc( void* args )
{
CoInitializeEx(NULL, COINIT_MULTITHREADED);
CEngineObj* engine = static_cast<CEngineObj*>(args);
DWORD dwResult;
HRESULT hr = S_OK;
// unmarshal interface pointer
IInternalEngineCallback* pCallback;
hr = CoGetInterfaceAndReleaseStream (*(engine->m_ppStream),
IID_IInternalEngineCallback,
(void**) &pCallback);
delete engine->m_ppStream;
engine->m_ppStream = NULL;
while(true)
{
dwResult = WaitForMultipleObjects( engine->NUM_EVENTS, engine->m_hEvents,
FALSE, INFINITE );
switch( dwResult )
{
case WAIT_OBJECT_0 + EVTEXIT:
pCallback->Release();
_endthreadex(0);
return 0;
}
}
CoUninitialize();
return 0;
}
HRESULT CEngineObj::FinalConstruct()
{
HRESULT hr = S_OK;
// Marshal interface pointer
m_ppStream = new IStream*;
hr = ::CoMarshalInterThreadInterfaceInStream(IID_IInternalEngineCallback,
reinterpret_cast<IInternalEngineCallback*>(this), m_ppStream);
if (FAILED (hr)) {
delete m_ppStream;
m_ppStream = NULL;
return hr;
}
// Create the thread
unsigned threadID;
m_hAnalysisThread = (HANDLE)_beginthreadex( NULL, 0, &AnalysisThreadProc,
this, 0, &threadID );
if( 0 == m_hAnalysisThread )
return E_FAIL;
return hr;
}
void CEngineObj::FinalRelease()
{
if( m_hAnalysisThread && m_hEvents[EVTEXIT] )
{
SetEvent(m_hEvents[EVTEXIT]);
WaitForSingleObject( m_hAnalysisThread, INFINITE );
CloseHandle(m_hAnalysisThread);
}
}
Any help would be greatly appreciated.