CWinThread* pThread= pState->m_pCurrentWinThread;
if (pThread !=NULL)
{
ASSERT_VALID(pThread);
ASSERT(pThread!=AfxGetApp());
// cleanup OLE if required
if (pThread->m_lpfnOleTermOrFreeLib !=NULL)
(*pThread->m_lpfnOleTermOrFreeLib)(TRUE,FALSE);
if (bDelete)
pThread->Delete();
pState->m_pCurrentWinThread=NULL;
}
// allow cleanup of any thread local objects
AfxTermThread();
// allow C-runtime to cleanup, and exit the thread
_endthreadex(nExitCode);
#endif //!_MT
}
/////////////////////////////////////////////////////////////////////
// Global functions forthread initialization and thread cleanup
LRESULT CALLBACK _AfxMsgFilterHook(intcode,WPARAMwParam,LPARAMlParam);
void AFXAPI AfxInitThread()
{
if (!afxContextIsDLL)
{
// set message filter proc
_AFX_THREAD_STATE* pThreadState= AfxGetThreadState();
ASSERT(pThreadState->m_hHookOldMsgFilter ==NULL);
pThreadState->m_hHookOldMsgFilter= ::SetWindowsHookEx(WH_MSGFILTER,
_AfxMsgFilterHook, NULL,::GetCurrentThreadId());
}
}
extern CThreadSlotData* _afxThreadData;
void AFXAPI AfxTermThread(HINSTANCEhInstTerm)
{
try
{
#ifdef _DEBUG
// check for missing AfxLockTempMap calls
if (AfxGetModuleThreadState()->m_nTempMapLock != 0)
{
TRACE(traceAppMsg,0,"Warning: Temp map lock count non-zero(%ld).\n",
AfxGetModuleThreadState()->m_nTempMapLock);
}
#endif
AfxLockTempMaps();
AfxUnlockTempMaps(-1);
}
catch( CException*e )
{