// This is a part of the Microsoft Foundation Classes C++ library. // Copyright (C) 1992-1998 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Microsoft Foundation Classes Reference and related // electronic documentation provided with the library. // See these sources for detailed information regarding the // Microsoft Foundation Classes product. #include "stdafx.h" #ifdef AFX_INIT_SEG #pragma code_seg(AFX_INIT_SEG) #endif #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // Initialization of MFC extension DLL static AFX_EXTENSION_MODULE extensionDLL; AFX_MODULE_STATE* AFXAPI _AfxGetOleModuleState(); ///////////////////////////////////////////////////////////////////////////// // Library initialization and cleanup extern "C" BOOL WINAPI RawDllMain(HINSTANCE, DWORD dwReason, LPVOID); extern "C" BOOL (WINAPI* _pRawDllMain)(HINSTANCE, DWORD, LPVOID) = &RawDllMain; #ifdef _DEBUG #ifndef _UNICODE #define MFC42_DLL "MFC42D.DLL" #else #define MFC42_DLL "MFC42UD.DLL" #endif #else #ifndef _UNICODE #define MFC42_DLL "MFC42.DLL" #else #define MFC42_DLL "MFC42U.DLL" #endif #endif extern "C" BOOL WINAPI RawDllMain(HINSTANCE, DWORD dwReason, LPVOID) { if (dwReason == DLL_PROCESS_ATTACH) { // Prevent the MFC DLL from being unloaded prematurely LoadLibraryA(MFC42_DLL); // 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); // save critical data pointers before running the constructors AFX_MODULE_STATE* pModuleState = AfxGetModuleState(); pModuleState->m_pClassInit = pModuleState->m_classList; pModuleState->m_pFactoryInit = pModuleState->m_factoryList; pModuleState->m_classList.m_pHead = NULL; pModuleState->m_factoryList.m_pHead = NULL; // set module state before initialization pModuleState = _AfxGetOleModuleState(); _AFX_THREAD_STATE* pState = AfxGetThreadState(); pState->m_pPrevModuleState = AfxSetModuleState(pModuleState); } else if (dwReason == DLL_PROCESS_DETACH) { // restore previously-saved module state VERIFY(AfxSetModuleState(AfxGetThreadState()->m_pPrevModuleState) == _AfxGetOleModuleState()); DEBUG_ONLY(AfxGetThreadState()->m_pPrevModuleState = NULL); // Now it's OK for the MFC DLL to be unloaded (see LoadLibrary above) FreeLibrary(GetModuleHandleA(MFC42_DLL)); } return TRUE; // ok } extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) { if (dwReason == DLL_PROCESS_ATTACH) { // shared initialization BOOL bRegister = !extensionDLL.bInitialized; 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(); VERIFY(AfxInitExtensionModule(extensionDLL, hInstance)); // wire up base DLL class list into private module state AfxCoreInitModule(); AfxWinInit(hInstance, NULL, _T(""), 0); // Register class factories in context of private module state if (bRegister) COleObjectFactory::RegisterAll(); // restore previously-saved module state VERIFY(AfxSetModuleState(AfxGetThreadState()->m_pPrevModuleState) == _AfxGetOleModuleState()); DEBUG_ONLY(AfxGetThreadState()->m_pPrevModuleState = NULL); // wire up this DLL into the base module state resource chain CDynLinkLibrary* pDLL = new CDynLinkLibrary(extensionDLL, TRUE); ASSERT(pDLL != NULL); pDLL->m_factoryList.m_pHead = NULL; } else if (dwReason == DLL_PROCESS_DETACH) { // cleanup module state in base module state AfxTermExtensionModule(extensionDLL); // set module state for cleanup ASSERT(AfxGetThreadState()->m_pPrevModuleState == NULL); AfxGetThreadState()->m_pPrevModuleState = AfxSetModuleState(_AfxGetOleModuleState()); // cleanup module state in OLE private module state AfxTermExtensionModule(extensionDLL, TRUE); } else if (dwReason == DLL_THREAD_DETACH) { AfxTermThread(hInstance); } return TRUE; // ok } //////////////////////////////////////////////////////////////////////////// // Special initialization entry point for controls void AFXAPI AfxOleInitModule() { ASSERT(AfxGetModuleState() != AfxGetAppModuleState()); CDynLinkLibrary* pDLL = new CDynLinkLibrary(extensionDLL, TRUE); ASSERT(pDLL != NULL); pDLL->m_factoryList.m_pHead = NULL; } //////////////////////////////////////////////////////////////////////////// // COM entry points STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { AFX_MANAGE_STATE(_AfxGetOleModuleState()); return AfxDllGetClassObject(rclsid, riid, ppv); } STDAPI DllCanUnloadNow(void) { AFX_MANAGE_STATE(_AfxGetOleModuleState()); return AfxDllCanUnloadNow(); } //////////////////////////////////////////////////////////////////////////// // Server registration STDAPI DllRegisterServer(void) { AFX_MANAGE_STATE(_AfxGetOleModuleState()); if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE)) return SELFREG_E_CLASS; return S_OK; } STDAPI DllUnregisterServer(void) { AFX_MANAGE_STATE(_AfxGetOleModuleState()); if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE)) return SELFREG_E_CLASS; return S_OK; } // This CWinApp is required so this module state has a CWinApp object! CWinApp _afxOleWinApp; ///////////////////////////////////////////////////////////////////////////// // static-linked version of AfxWndProc for use by this module #undef AfxWndProc LRESULT CALLBACK AfxWndProcDllOle(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam) { AFX_MANAGE_STATE(_AfxGetOleModuleState()); return AfxWndProc(hWnd, nMsg, wParam, lParam); } ///////////////////////////////////////////////////////////////////////////// // initialize app state such that it points to this module's core state #ifndef _AFX_NO_OCC_SUPPORT class _AFX_INIT_OLE_DLL_STATE { public: ~_AFX_INIT_OLE_DLL_STATE(); }; _AFX_INIT_OLE_DLL_STATE::~_AFX_INIT_OLE_DLL_STATE() { // OLE dll is not loaded any more, so no OLE controls capability afxOccManager = NULL; } #endif ///////////////////////////////////////////////////////////////////////////// // force initialization early #pragma warning(disable: 4074) #pragma init_seg(lib) static AFX_MODULE_STATE _afxOleModuleState(TRUE, &AfxWndProcDllOle, _MFC_VER, TRUE); #ifndef _AFX_NO_OCC_SUPPORT _AFX_INIT_OLE_DLL_STATE _afxInitOleDllState; #endif AFX_MODULE_STATE* AFXAPI _AfxGetOleModuleState() { return &_afxOleModuleState; } ///////////////////////////////////////////////////////////////////////////// #ifdef AFX_VDEL_SEG #pragma code_seg(AFX_VDEL_SEG) #endif static void _AfxForceVectorDelete() { ASSERT(FALSE); // never called new COleDataSource[2]; new COleDispatchDriver[2]; new COleDropSource[2]; new COleResizeBar[2]; new COleStreamFile[2]; new CMonikerFile[2]; new COleTemplateServer[2]; new COleDataObject[2]; new COleDropTarget[2]; new COleIPFrameWnd[2]; new COleDocIPFrameWnd[2]; new CAsyncMonikerFile[2]; new CCachedDataPathProperty[2]; new CDataPathProperty[2]; new COleVariant[2]; new CRichEditView[2]; new CRichEditCntrItem[2]; } void (*_afxForceVectorDelete_mfco)() = &_AfxForceVectorDelete; /////////////////////////////////////////////////////////////////////////////