// EventRaiseActionMgr.cpp: implementation of the CEventRaiseActionMgr class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "datamanager.h" #include "EventRaiseActionMgr.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CMapStringToPtr CEventRaiseActionMgr::m_mapMgrs; CMutex CEventRaiseActionMgr::m_mutexMgrs; CEventRaiseActionMgr::CEventRaiseActionMgr() { m_pfEventRaiseActionBase = NULL; m_pfInitActDll = NULL; m_pfUninitActDll = NULL; m_hDll = NULL; } CEventRaiseActionMgr::~CEventRaiseActionMgr() { FreeDll(); } BOOL CEventRaiseActionMgr::LoadDll(CString strDll) { if(m_hDll == NULL) { m_hDll = LoadLibrary(strDll); if(m_hDll) { m_pfInitActDll = (Def_InitActDll*)GetProcAddress(m_hDll, "InitActDll"); m_pfUninitActDll = (Def_UninitActDll*)GetProcAddress(m_hDll, "UninitActDll"); m_pfEventRaiseActionBase = (Def_EventRaiseActionBase*)GetProcAddress(m_hDll, "EventRaiseActionBase"); if(m_pfEventRaiseActionBase == NULL) { FreeDll(); } else { if(m_pfInitActDll) { try { m_pfInitActDll(); } catch (...) { } } } } } return (m_hDll != NULL); } void CEventRaiseActionMgr::FreeDll() { if(m_hDll) { if(m_pfUninitActDll) { try { m_pfUninitActDll(); } catch(...) { } } FreeLibrary(m_hDll); } m_hDll = NULL; m_pfEventRaiseActionBase = NULL; m_pfInitActDll = NULL; m_pfUninitActDll = NULL; } void CEventRaiseActionMgr::EventRaiseActionBase(CDataNodeBase* pNode, int nStatus) { if(m_pfEventRaiseActionBase) { try { m_pfEventRaiseActionBase(pNode, nStatus); } catch (...) { } } } CEventRaiseActionMgr* CEventRaiseActionMgr::GetRaiseActDll(CString strDll) { CEventRaiseActionMgr* pMgr = NULL; if(!m_mapMgrs.Lookup(strDll, (void*&)pMgr)) { pMgr = new CEventRaiseActionMgr; m_mutexMgrs.Lock(); pMgr->LoadDll(strDll); m_mapMgrs.SetAt(strDll, pMgr); m_mutexMgrs.Unlock(); } return pMgr; } void CEventRaiseActionMgr::FreeDllAll() { m_mutexMgrs.Lock(); POSITION pos = m_mapMgrs.GetStartPosition(); while (pos) { CString strDll; CEventRaiseActionMgr* pMgr = NULL; m_mapMgrs.GetNextAssoc(pos, strDll, (void*&)pMgr); delete pMgr; } m_mapMgrs.RemoveAll(); m_mutexMgrs.Unlock(); }