void PASCAL COleObjectFactory::RevokeAll() { AFX_MODULE_STATE* pModuleState = AfxGetModuleState(); AfxLockGlobals(CRIT_OBJECTFACTORYLIST); for (COleObjectFactory* pFactory = pModuleState->m_factoryList; pFactory != NULL; pFactory = pFactory->m_pNextFactory) { pFactory->Revoke(); } AfxUnlockGlobals(CRIT_OBJECTFACTORYLIST); #ifdef _AFXDLL AfxLockGlobals(CRIT_DYNLINKLIST); // register extension DLL factories for (CDynLinkLibrary* pDLL = pModuleState->m_libraryList; pDLL != NULL; pDLL = pDLL->m_pNextDLL) { for (pFactory = pDLL->m_factoryList; pFactory != NULL; pFactory = pFactory->m_pNextFactory) { pFactory->Revoke(); } } AfxUnlockGlobals(CRIT_DYNLINKLIST); #endif }
BOOL PASCAL COleObjectFactory::UpdateRegistryAll(BOOL bRegister) { AFX_MODULE_STATE* pModuleState = AfxGetModuleState(); AfxLockGlobals(CRIT_OBJECTFACTORYLIST); for (COleObjectFactory* pFactory = pModuleState->m_factoryList; pFactory != NULL; pFactory = pFactory->m_pNextFactory) { if (!pFactory->UpdateRegistry(bRegister)) { AfxUnlockGlobals(CRIT_OBJECTFACTORYLIST); return FALSE; } } AfxUnlockGlobals(CRIT_OBJECTFACTORYLIST); #ifdef _AFXDLL AfxLockGlobals(CRIT_DYNLINKLIST); // register extension DLL factories for (CDynLinkLibrary* pDLL = pModuleState->m_libraryList; pDLL != NULL; pDLL = pDLL->m_pNextDLL) { for (pFactory = pDLL->m_factoryList; pFactory != NULL; pFactory = pFactory->m_pNextFactory) { if (!pFactory->UpdateRegistry(bRegister)) { AfxUnlockGlobals(CRIT_DYNLINKLIST); return FALSE; } } } AfxUnlockGlobals(CRIT_DYNLINKLIST); #endif return TRUE; }
SCODE AFXAPI AfxDllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { SCODE sc; *ppv = NULL; AFX_OLE_STATE* pOleState = AfxGetOleState(); // search factories defined in the application for (COleObjectFactory* pFactory = pOleState->m_pFirstFactory; pFactory != NULL; pFactory = pFactory->m_pNextFactory) { if (pFactory->m_dwRegister != 0 && pFactory->m_clsid == rclsid) { // found suitable class factory -- query for correct interface sc = pFactory->ExternalQueryInterface(&riid, ppv); if (sc != NOERROR) return sc; #ifndef _UNICODE LPUNKNOWN lpUnk = (LPUNKNOWN)*ppv; ASSERT(lpUnk != NULL); sc = ::Ole2AnsiWFromA(riid, lpUnk, (LPUNKNOWN*)ppv); lpUnk->Release(); #endif return sc; } } #ifdef _AFXDLL // search factories defined in extension DLLs AFX_CORE_STATE* pCoreState = AfxGetCoreState(); for (CDynLinkLibrary* pDLL = pCoreState->m_pFirstDLL; pDLL != NULL; pDLL = pDLL->m_pNextDLL) { for (pFactory = pDLL->m_pFirstSharedFactory; pFactory != NULL; pFactory = pFactory->m_pNextFactory) { if (pFactory->m_dwRegister != 0 && pFactory->m_clsid == rclsid) { // found suitable class factory -- query for correct interface sc = pFactory->ExternalQueryInterface(&riid, ppv); if (sc != NOERROR) return sc; #ifndef _UNICODE LPUNKNOWN lpUnk = (LPUNKNOWN)*ppv; ASSERT(lpUnk != NULL); sc = ::Ole2AnsiWFromA(riid, lpUnk, (LPUNKNOWN*)ppv); lpUnk->Release(); #endif return sc; } } } #endif // factory not registered -- return error return CLASS_E_CLASSNOTAVAILABLE; }
SCODE AFXAPI AfxDllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { *ppv = NULL; DWORD lData1 = rclsid.Data1; // search factories defined in the application AFX_MODULE_STATE* pModuleState = AfxGetModuleState(); AfxLockGlobals(CRIT_OBJECTFACTORYLIST); COleObjectFactory* pFactory; for (pFactory = pModuleState->m_factoryList; pFactory != NULL; pFactory = pFactory->m_pNextFactory) { if (pFactory->m_bRegistered != 0 && lData1 == pFactory->m_clsid.Data1 && ((DWORD*)&rclsid)[1] == ((DWORD*)&pFactory->m_clsid)[1] && ((DWORD*)&rclsid)[2] == ((DWORD*)&pFactory->m_clsid)[2] && ((DWORD*)&rclsid)[3] == ((DWORD*)&pFactory->m_clsid)[3]) { // found suitable class factory -- query for correct interface SCODE sc = pFactory->InternalQueryInterface(&riid, ppv); AfxUnlockGlobals(CRIT_OBJECTFACTORYLIST); return sc; } } AfxUnlockGlobals(CRIT_OBJECTFACTORYLIST); #ifdef _AFXDLL AfxLockGlobals(CRIT_DYNLINKLIST); // search factories defined in extension DLLs CDynLinkLibrary* pDLL; for (pDLL = pModuleState->m_libraryList; pDLL != NULL; pDLL = pDLL->m_pNextDLL) { for (COleObjectFactory* pDLLFactory = pDLL->m_factoryList; pDLLFactory != NULL; pDLLFactory = pDLLFactory->m_pNextFactory) { if (pDLLFactory->m_bRegistered != 0 && lData1 == pDLLFactory->m_clsid.Data1 && ((DWORD*)&rclsid)[1] == ((DWORD*)&pDLLFactory->m_clsid)[1] && ((DWORD*)&rclsid)[2] == ((DWORD*)&pDLLFactory->m_clsid)[2] && ((DWORD*)&rclsid)[3] == ((DWORD*)&pDLLFactory->m_clsid)[3]) { // found suitable class factory -- query for correct interface SCODE sc = pDLLFactory->InternalQueryInterface(&riid, ppv); AfxUnlockGlobals(CRIT_DYNLINKLIST); return sc; } } } AfxUnlockGlobals(CRIT_DYNLINKLIST); #endif // factory not registered -- return error return CLASS_E_CLASSNOTAVAILABLE; }
BOOL PASCAL COleObjectFactory::UnregisterAll() { BOOL bResult = TRUE; // register application factories AFX_MODULE_STATE* pModuleState = AfxGetModuleState(); AfxLockGlobals(CRIT_OBJECTFACTORYLIST); for (COleObjectFactory* pFactory = pModuleState->m_factoryList; pFactory != NULL; pFactory = pFactory->m_pNextFactory) { // unregister any registered, non-doctemplate factories if (pFactory->IsRegistered() && !pFactory->Unregister()) { bResult = FALSE; } } AfxUnlockGlobals(CRIT_OBJECTFACTORYLIST); return bResult; }
BOOL PASCAL COleObjectFactory::RegisterAll() { BOOL bResult = TRUE; // register application factories AFX_MODULE_STATE* pModuleState = AfxGetModuleState(); AfxLockGlobals(CRIT_OBJECTFACTORYLIST); for (COleObjectFactory* pFactory = pModuleState->m_factoryList; pFactory != NULL; pFactory = pFactory->m_pNextFactory) { // register any non-registered, non-doctemplate factories if (!pFactory->IsRegistered() && pFactory->m_clsid != CLSID_NULL && !pFactory->Register()) { bResult = FALSE; } } AfxUnlockGlobals(CRIT_OBJECTFACTORYLIST); #ifdef _AFXDLL // register extension DLL factories AfxLockGlobals(CRIT_DYNLINKLIST); for (CDynLinkLibrary* pDLL = pModuleState->m_libraryList; pDLL != NULL; pDLL = pDLL->m_pNextDLL) { for (pFactory = pDLL->m_factoryList; pFactory != NULL; pFactory = pFactory->m_pNextFactory) { // register any non-registered, non-doctemplate factories if (!pFactory->IsRegistered() && pFactory->m_clsid != CLSID_NULL && !pFactory->Register()) { bResult = FALSE; } } } AfxUnlockGlobals(CRIT_DYNLINKLIST); #endif return bResult; }
extern "C" int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { if (dwReason == DLL_PROCESS_ATTACH) { TRACE0("FILLMODE.VMD Initializing!\n"); bool bRegister = !FillModeDLL.bInitialized; GetModuleFileName (hInstance, g_pDLLName, _MAX_PATH); g_hInstance = hInstance; #if !defined(_NOVERSION) PreCalcVersion(); #endif // !defined(_NOVERSION) // Extension DLL one-time initialization if (!AfxInitExtensionModule(FillModeDLL, hInstance)) { TRACE1("Could not init ExtensionModule %s\r\n", g_pDLLName); return false; // failure } // Insert this DLL into the resource chain CDynLinkLibrary *pDLL = new CDynLinkLibrary(FillModeDLL); if (pDLL == NULL) { TRACE1("Out of memory in DLLInit of %s\r\n", g_pDLLName); return false; // failure } pDLL -> m_bSystem = true; // externe Funktionen von Trias abfragen #if defined(__XT) && defined(__DEXPROCS) HMODULE hTrias = GetModuleHandle (NULL); g_pDexExtensionProc = (DEXEXTENSIONPROC)GetProcAddress (hTrias, "DEXEXTENSIONPROC"); #endif // __XT && __DEXPROCS #if _MSC_VER >= 1000 { // Register class factories in context of private module state bool bResult = true; if (bRegister) { // register this DLL's factories AfxLockGlobals(CRIT_OBJECTFACTORYLIST); for (COleObjectFactory *pFactory = pDLL->m_factoryList; pFactory != NULL; pFactory = pFactory->m_pNextFactory) { // register any non-registered, non-doctemplate factories if (!pFactory->IsRegistered() && pFactory->GetClassID() != CLSID_NULL && !pFactory->Register()) { TRACE1("Could not init classFactory in %s\r\n", g_pDLLName); bResult = false; } } AfxUnlockGlobals(CRIT_OBJECTFACTORYLIST); } if (!bResult) return false; } #endif //_MSC_VER } else if (dwReason == DLL_PROCESS_DETACH) { TRACE0("FILLMODE.VMD Terminating!\n"); AfxTermExtensionModule(FillModeDLL); } return 1; // ok }