//--------------------------------------------------------------------------- // DllMain.cpp - Dll Entry point for UxTheme DLL //--------------------------------------------------------------------------- #include "stdafx.h" #include "Utils.h" #include "sethook.h" #include "CacheList.h" #include "RenderList.h" #include "info.h" #include "themeldr.h" //--------------------------------------------------------------------------- BOOL ThreadStartUp() { BOOL fInit = ThemeLibStartUp(TRUE); Log(LOG_TMSTARTUP, L"Thread startup"); return fInit; } //--------------------------------------------------------------------------- BOOL ThreadShutDown() { Log(LOG_TMSTARTUP, L"Thread shutdown"); ThemeLibShutDown(TRUE); //---- destroy the thread-local object pool ---- CCacheList *pList = GetTlsCacheList(FALSE); if (pList) { TlsSetValue(_tls_CacheListIndex, NULL); delete pList; } return TRUE; } //--------------------------------------------------------------------------- BOOL ProcessStartUp(HINSTANCE hModule) { //---- don't init twice ---- if (g_fUxthemeInitialized) { return TRUE; } g_hInst = hModule; _tls_CacheListIndex = TlsAlloc(); if (_tls_CacheListIndex == (DWORD) -1) goto exit; if (!ThemeLibStartUp(FALSE)) goto cleanup4; if (!GlobalsStartup()) goto cleanup3; if (!ThemeHookStartup()) goto cleanup2; // everything succeeded! Log(LOG_TMSTARTUP, L"Finished ProcessStartUp() (succeeded)"); return TRUE; cleanup2: GlobalsShutdown(); cleanup3: ThemeLibShutDown(FALSE); cleanup4: TlsFree(_tls_CacheListIndex); exit: // something failed Log(LOG_TMSTARTUP, L"Finished ProcessStartUp() (failure)"); return FALSE; } //--------------------------------------------------------------------------- BOOL ProcessShutDown() { //---- beware: in case of StartUp failure, all resources may not have been allocated ---- Log(LOG_TMSTARTUP, L"Starting ProcessShutDown()"); ThreadShutDown(); // not called by system on last thread //---- process shutdown ---- ThemeLibShutDown(FALSE); ThemeHookShutdown(); GlobalsShutdown(); TlsFree(_tls_CacheListIndex); _tls_CacheListIndex = 0xffffffff; return TRUE; } //--------------------------------------------------------------------------- BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { BOOL fOk = TRUE; switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: fOk = ProcessStartUp(hModule); break; case DLL_THREAD_ATTACH: fOk = ThreadStartUp(); break; case DLL_THREAD_DETACH: fOk = ThreadShutDown(); break; case DLL_PROCESS_DETACH: fOk = ProcessShutDown(); break; } return fOk; } //---------------------------------------------------------------------------