home *** CD-ROM | disk | FTP | other *** search
- // 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_OLE3_SEG
- #pragma code_seg(AFX_OLE3_SEG)
- #endif
-
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
-
- /////////////////////////////////////////////////////////////////////////////
- // Support for MFC/COM in DLLs
-
- 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);
- for (COleObjectFactory* 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
- 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->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_DYNLINKLIST);
- return sc;
- }
- }
- }
- AfxUnlockGlobals(CRIT_DYNLINKLIST);
- #endif
-
- // factory not registered -- return error
- return CLASS_E_CLASSNOTAVAILABLE;
- }
-
- SCODE AFXAPI AfxDllCanUnloadNow(void)
- {
- // return S_OK only if no outstanding objects active
- if (!AfxOleCanExitApp())
- return S_FALSE;
-
- // check if any class factories with >1 reference count
- AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
- AfxLockGlobals(CRIT_OBJECTFACTORYLIST);
- for (COleObjectFactory* pFactory = pModuleState->m_factoryList;
- pFactory != NULL; pFactory = pFactory->m_pNextFactory)
- {
- if (pFactory->m_dwRef > 1)
- {
- AfxUnlockGlobals(CRIT_OBJECTFACTORYLIST);
- return S_FALSE;
- }
- }
- AfxUnlockGlobals(CRIT_OBJECTFACTORYLIST);
- #ifdef _AFXDLL
- AfxLockGlobals(CRIT_DYNLINKLIST);
- // search factories defined in extension DLLs
- 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->m_dwRef > 1)
- {
- AfxUnlockGlobals(CRIT_DYNLINKLIST);
- return S_FALSE;
- }
- }
- }
- AfxUnlockGlobals(CRIT_DYNLINKLIST);
- #endif
-
- TRACE0("Info: AfxDllCanUnloadNow returning S_OK\n");
- return S_OK;
- }
-
- /////////////////////////////////////////////////////////////////////////////
-