BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID) { if (dwReason == DLL_PROCESS_ATTACH) { #ifdef _AFX_OLE_IMPL BOOL bRegister = !coreDLL.bInitialized; // shared initialization AFX_MODULE_STATE* pModuleState = _AfxGetOleModuleState(); pModuleState->m_hCurrentInstanceHandle = hInstance; pModuleState->m_hCurrentResourceHandle = hInstance; pModuleState->m_pClassInit = pModuleState->m_classList.GetHead(); pModuleState->m_pFactoryInit = pModuleState->m_factoryList.GetHead(); #endif // initialize this DLL's extension module VERIFY(AfxInitExtensionModule(coreDLL, hInstance)); #ifdef _AFX_OLE_IMPL AfxWinInit(hInstance, NULL, &afxChNil, 0); // Register class factories in context of private module state if (bRegister) COleObjectFactory::RegisterAll(); #endif #ifdef _AFX_OLE_IMPL // restore previously-saved module state VERIFY(AfxSetModuleState(AfxGetThreadState()->m_pPrevModuleState) == _AfxGetOleModuleState()); DEBUG_ONLY(AfxGetThreadState()->m_pPrevModuleState = NULL); #endif // wire up this DLL into the resource chain CDynLinkLibrary* pDLL = new CDynLinkLibrary(coreDLL, TRUE); ASSERT(pDLL != NULL); pDLL->m_factoryList.m_pHead = NULL; // load language specific DLL // the DLL must be in the "system directory" static const char szPrefix[] = "\\MFC42"; static const char szLOC[] = "LOC"; static const char szDLL[] = ".DLL"; char szLangDLL[_MAX_PATH+14]; // Note: 8.3 name GetSystemDirectoryA(szLangDLL, _countof(szLangDLL)); lstrcatA(szLangDLL, szPrefix); // try MFC42LOC.DLL lstrcatA(szLangDLL, szLOC); lstrcatA(szLangDLL, szDLL); HINSTANCE hLangDLL = LoadLibraryA(szLangDLL); AFX_MODULE_STATE* pState = AfxGetModuleState(); pState->m_appLangDLL = hLangDLL; #ifdef _AFX_OLE_IMPL // copy it to the private OLE state too pModuleState->m_appLangDLL = hLangDLL; #endif } else if (dwReason == DLL_PROCESS_DETACH) { // free language specific DLL AFX_MODULE_STATE* pState = AfxGetModuleState(); if (pState->m_appLangDLL != NULL) { ::FreeLibrary(pState->m_appLangDLL); pState->m_appLangDLL = NULL; } // free the DLL info blocks CDynLinkLibrary* pDLL; while ((pDLL = pState->m_libraryList) != NULL) delete pDLL; ASSERT(pState->m_libraryList.IsEmpty()); // cleanup module state for this process AfxTermExtensionModule(coreDLL); #ifdef _AFX_OLE_IMPL // set module state for cleanup ASSERT(AfxGetThreadState()->m_pPrevModuleState == NULL); AfxGetThreadState()->m_pPrevModuleState = AfxSetModuleState(_AfxGetOleModuleState()); #endif // cleanup module state in OLE private module state AfxTermExtensionModule(coreDLL, TRUE); // free any local data for this process/thread AfxTermLocalData(NULL, TRUE); } else if (dwReason == DLL_THREAD_DETACH) { AfxTermThread(); } return TRUE; // ok }
void WFE_EndSetModuleState(void* pPrevState) { AfxSetModuleState((AFX_MODULE_STATE*)pPrevState); }
BOOL WINAPI RawDllMain(HINSTANCE /*hInstance*/, DWORD dwReason, LPVOID) { if (dwReason == DLL_PROCESS_ATTACH) { // Prevent the C runtime DLL from being unloaded prematurely LoadLibraryA(MSVCRT_DLL); #ifdef _UNICODE // give error message and exit if running Unicode on non-Unicode system if (GetVersion() & 0x80000000) { // Note: this message is for programmers who can read english ::MessageBoxA(NULL, "This application or DLL can not be loaded " "on Windows 95 or on Windows 3.1. It takes advantage " "of Unicode features only available on Windows NT.", "MFC Runtime Module", MB_ICONSTOP|MB_OK); return FALSE; // and fail } #endif SetErrorMode(SetErrorMode(0) | SEM_FAILCRITICALERRORS|SEM_NOOPENFILEERRORBOX); // add a reference to thread local storage data AfxTlsAddRef(); // make sure we have enough memory to attempt to start (8kb) void* pMinHeap = LocalAlloc(NONZEROLPTR, 0x2000); if (pMinHeap == NULL) return FALSE; // fail if memory alloc fails LocalFree(pMinHeap); // cause early initialization of _afxCriticalSection if (!AfxCriticalInit()) return FALSE; #ifdef _AFX_OLE_IMPL // set module state before initialization AFX_MODULE_STATE* pModuleState = _AfxGetOleModuleState(); _AFX_THREAD_STATE* pState = AfxGetThreadState(); pState->m_pPrevModuleState = AfxSetModuleState(pModuleState); #endif } else if (dwReason == DLL_PROCESS_DETACH) { #ifdef _AFX_OLE_IMPL _AFX_THREAD_STATE* pThreadState = _afxThreadState.GetDataNA(); if (pThreadState != NULL) { // restore previously-saved module state VERIFY(AfxSetModuleState(pThreadState->m_pPrevModuleState) == _AfxGetOleModuleState()); DEBUG_ONLY(pThreadState->m_pPrevModuleState = NULL); } #endif // free up the _afxCriticalSection AfxCriticalTerm(); // Now it's OK for C runtime DLL to be unloaded (see LoadLibrary above) FreeLibrary(GetModuleHandleA(MSVCRT_DLL)); // remove reference from thread local data AfxTlsRelease(); } return TRUE; // ok }
void* WFE_BeginSetModuleState() { return AfxSetModuleState(AfxGetAppModuleState()); }