123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- #pragma once
- //#include <afx.h>
- 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; \
- }
|