Пример #1
0
void CExeModule::MonitorShutdown() {
#if 1
	WaitForSingleObject(hEventShutdown, INFINITE);
	#if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
	CoSuspendClassObjects();
	#endif
#else
	while (1) {
		WaitForSingleObject(hEventShutdown, INFINITE);
		DWORD dwWait=0;
		do {
			bActivity = false;
			dwWait = WaitForSingleObject(hEventShutdown, dwTimeOut);
		} while (dwWait == WAIT_OBJECT_0);
        //-- timed out
		if (!bActivity && m_nLockCnt == 0) { // if no activity let's really bail
			#if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
            CoSuspendClassObjects();
            if (!bActivity && m_nLockCnt == 0)
			#endif
                break;
        }
    }
#endif
	CloseHandle(hEventShutdown);
	CloseHandle(hMonitorThread);
	#ifdef _DEBUG
	PlaySound("chimes.wav",NULL,SND_FILENAME|SND_ASYNC);
	#endif
	PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
}
Пример #2
0
//Monitors the shutdown event
void CExeModule::MonitorShutdown()
{
    while (1)
    {
        WaitForSingleObject(hEventShutdown, INFINITE);
        DWORD dwWait=0;
        do
        {
            bActivity = false;
            dwWait = WaitForSingleObject(hEventShutdown, dwTimeOut);
        } while (dwWait == WAIT_OBJECT_0);
	
	// timed out
        if (!bActivity && m_nLockCnt == 0) // if no activity let's really bail
        {
#if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
            CoSuspendClassObjects();
            if (!bActivity && m_nLockCnt == 0)
#endif
                break;
        }
    }
    CloseHandle(hEventShutdown);
    PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
}
Пример #3
0
/*----------------------------------------------------------------------------------------------
	For an exe, we post a WM_QUIT message to the main thread when the module reference
		count goes to zero.
----------------------------------------------------------------------------------------------*/
long ModuleEntry::ModuleRelease(void)
{
	long ln = InterlockedDecrement(&s_crefModule);
	if (!ln)
	{
		if (CoSuspendClassObjects() == S_OK)
			PostThreadMessage(s_tid, WM_QUIT, 0, 0);
	}
	return ln;
}
Пример #4
0
LONG CExeModule::Unlock()
{
    LONG l = CComModule::Unlock();
    if (l == 0)
    {
        if (CoSuspendClassObjects() == S_OK)
            PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
    }
    return l;
}
Пример #5
0
void CExeModule::MonitorShutdown() {
	WaitForSingleObject(hEventShutdown, INFINITE);
	#ifdef _ATL_FREE_THREADED
	CoSuspendClassObjects();
	#endif
	CloseHandle(hEventShutdown);
	CloseHandle(hMonitorThread);
	#ifdef _DEBUG
	PlaySound(_T("chimes.wav"),NULL,SND_FILENAME|SND_ASYNC);
	#endif
	PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
}
LONG CExeModule::Unlock()
{
	DWORD dwCurrentThread = ::GetCurrentThreadId();

	LONG l = CComModule::Unlock();
	if (l == 0)
	{
#if _WIN32_WINNT >= 0x0400
		if (CoSuspendClassObjects() == S_OK)
			PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
#else
		PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
#endif
	}
	return l;
}