#pragma once //#include class CDLLModule { public: CDLLModule() : m_hDLL(NULL) { } virtual ~CDLLModule() { if (m_hDLL) ::FreeLibrary(m_hDLL); //POSITION pos; //for(pos=m_mapDLL.GetStartPosition(); pos!=NULL;) //{ // CString strKey; // HMODULE ptrVal; // m_mapDLL.GetNextAssoc(pos, strKey, (void*&)ptrVal); // if (ptrVal) // { // TRACE1("卸载动态库:%s\n", strKey); // ::FreeLibrary(ptrVal); // } //} } // used macros to generate the implementation virtual bool Init(LPCTSTR szDll)=0; virtual bool Init(LPCTSTR szPath, UINT nCnt, ...)=0; protected: HMODULE m_hDLL; //CMapStringToPtr m_mapDLL; // LPCTSTR(key) -> HMODULE }; ////////////////////////////////////////////////////////////////////// // macros to implement the Init function #define DECLARE_DLL_FUNCTION(ret, cc, func, params) \ ret (cc* func)params; #define DECLARE_DLL_FUNCTION_3(return_type, spec, function_name, params) \ typedef return_type (spec PROC_##function_name) params; \ PROC_##function_name * ##function_name; #define BEGIN_DLL_INIT() \ bool Init(LPCTSTR szDll) \ { \ if (m_hDLL) \ ::FreeLibrary(m_hDLL); \ m_hDLL = ::LoadLibrary(szDll); \ bool bOk = true; // 多一个参数,可定义与导出函数不同的名称 #define INIT_DLL_FUNCTION(ret, cc, func, params, origin) \ if (m_hDLL) \ { \ func = (ret (cc* )params)GetProcAddress(m_hDLL, origin); \ } \ else \ func = NULL; \ if (!func) \ bOk = false; // 使用与导出函数相同的名称 #define INIT_DLL_FUNCTION_2(ret, cc, func, params) \ if (m_hDLL) \ { \ func = (ret (cc* )params)GetProcAddress(m_hDLL, #func); \ } \ else \ func = NULL; \ if (!func) \ bOk = false; // 使用了typedef的简化版 #define INIT_DLL_FUNCTION_3(function_name) \ if( NULL != m_hDLL ) \ function_name = (PROC_##function_name *) GetProcAddress( m_hDLL, #function_name ); \ else \ function_name = NULL; \ if(NULL == function_name) \ bOk = false; #define END_DLL_INIT() \ return bOk; \ } ////////////////////////////////////////////////////////////////////////// #define DECLARE_DLL_FUNCTION_MULTI(return_type, spec, function_name, params) \ typedef return_type (spec PROC_##function_name) params; \ PROC_##function_name * ##function_name; #define BEGIN_DLL_INIT_MULTI() \ bool Init(LPCTSTR szPath, UINT nCnt, ...) \ { \ POSITION pos; \ for(pos=m_mapDLL.GetStartPosition(); pos!=NULL;) \ { \ CString strKey; \ HMODULE ptrVal; \ m_mapDLL.GetNextAssoc(pos, strKey, (void*&)ptrVal); \ if (ptrVal) \ { \ TRACE1("卸载动态库:%s\n", strKey); \ ::FreeLibrary(ptrVal); \ } \ } \ m_mapDLL.RemoveAll(); \ va_list nameList; \ va_start(nameList, nCnt); \ UINT i = 0; \ HMODULE hModule = NULL; \ CString strName, strPath, strFile; \ strPath = szPath; \ while(i < nCnt) \ { \ strName = va_arg(nameList, LPCTSTR); \ strFile = strPath + strName; \ hModule = ::LoadLibrary(strFile); \ m_mapDLL.SetAt(strName, hModule); \ TRACE2("加载动态库:%s -> %d\n", strFile, hModule); \ i++; \ } \ bool bOk = true; // C标准导出版 #define INIT_DLL_FUNCTION_MULTI(function_name, dll_name) \ m_mapDLL.Lookup(dll_name, (void*&)hModule); \ if( NULL != hModule ) \ { \ function_name = (PROC_##function_name *) GetProcAddress( hModule, #function_name ); \ CString strTrace; \ strTrace.Format("加载函数:%s()[%d] -> %s[%d]\n", #function_name, function_name, dll_name, hModule); \ TRACE0(strTrace); \ } \ else \ { \ function_name = NULL; \ TRACE0("NULL\n"); \ } \ if(NULL == function_name) \ bOk = false; // C++标准导出版 #define INIT_DLL_FUNCTION_MULTI_2(function_name, function_realname, dll_name) \ m_mapDLL.Lookup(dll_name, (void*&)hModule); \ if( NULL != hModule ) \ { \ function_name = (PROC_##function_name *) GetProcAddress( hModule, #function_realname ); \ CString strTrace; \ strTrace.Format("加载函数:%s() - %s[%d] -> %s[%d]\n", #function_name, #function_realname, function_name, dll_name, hModule); \ TRACE0(strTrace); \ } \ else \ { \ function_name = NULL; \ TRACE0("NULL\n"); \ } \ if(NULL == function_name) \ bOk = false; #define END_DLL_INIT_MULTI() \ return bOk; \ }