DLLModule.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. #pragma once
  2. //#include <afx.h>
  3. class CDLLModule
  4. {
  5. public:
  6. CDLLModule() : m_hDLL(NULL)
  7. {
  8. }
  9. virtual ~CDLLModule()
  10. {
  11. if (m_hDLL)
  12. ::FreeLibrary(m_hDLL);
  13. //POSITION pos;
  14. //for(pos=m_mapDLL.GetStartPosition(); pos!=NULL;)
  15. //{
  16. // CString strKey;
  17. // HMODULE ptrVal;
  18. // m_mapDLL.GetNextAssoc(pos, strKey, (void*&)ptrVal);
  19. // if (ptrVal)
  20. // {
  21. // TRACE1("卸载动态库:%s\n", strKey);
  22. // ::FreeLibrary(ptrVal);
  23. // }
  24. //}
  25. }
  26. // used macros to generate the implementation
  27. virtual bool Init(LPCTSTR szDll)=0;
  28. virtual bool Init(LPCTSTR szPath, UINT nCnt, ...)=0;
  29. protected:
  30. HMODULE m_hDLL;
  31. //CMapStringToPtr m_mapDLL; // LPCTSTR(key) -> HMODULE
  32. };
  33. //////////////////////////////////////////////////////////////////////
  34. // macros to implement the Init function
  35. #define DECLARE_DLL_FUNCTION(ret, cc, func, params) \
  36. ret (cc* func)params;
  37. #define DECLARE_DLL_FUNCTION_3(return_type, spec, function_name, params) \
  38. typedef return_type (spec PROC_##function_name) params; \
  39. PROC_##function_name * ##function_name;
  40. #define BEGIN_DLL_INIT() \
  41. bool Init(LPCTSTR szDll) \
  42. { \
  43. if (m_hDLL) \
  44. ::FreeLibrary(m_hDLL); \
  45. m_hDLL = ::LoadLibrary(szDll); \
  46. bool bOk = true;
  47. // 多一个参数,可定义与导出函数不同的名称
  48. #define INIT_DLL_FUNCTION(ret, cc, func, params, origin) \
  49. if (m_hDLL) \
  50. { \
  51. func = (ret (cc* )params)GetProcAddress(m_hDLL, origin); \
  52. } \
  53. else \
  54. func = NULL; \
  55. if (!func) \
  56. bOk = false;
  57. // 使用与导出函数相同的名称
  58. #define INIT_DLL_FUNCTION_2(ret, cc, func, params) \
  59. if (m_hDLL) \
  60. { \
  61. func = (ret (cc* )params)GetProcAddress(m_hDLL, #func); \
  62. } \
  63. else \
  64. func = NULL; \
  65. if (!func) \
  66. bOk = false;
  67. // 使用了typedef的简化版
  68. #define INIT_DLL_FUNCTION_3(function_name) \
  69. if( NULL != m_hDLL ) \
  70. function_name = (PROC_##function_name *) GetProcAddress( m_hDLL, #function_name ); \
  71. else \
  72. function_name = NULL; \
  73. if(NULL == function_name) \
  74. bOk = false;
  75. #define END_DLL_INIT() \
  76. return bOk; \
  77. }
  78. //////////////////////////////////////////////////////////////////////////
  79. #define DECLARE_DLL_FUNCTION_MULTI(return_type, spec, function_name, params) \
  80. typedef return_type (spec PROC_##function_name) params; \
  81. PROC_##function_name * ##function_name;
  82. #define BEGIN_DLL_INIT_MULTI() \
  83. bool Init(LPCTSTR szPath, UINT nCnt, ...) \
  84. { \
  85. POSITION pos; \
  86. for(pos=m_mapDLL.GetStartPosition(); pos!=NULL;) \
  87. { \
  88. CString strKey; \
  89. HMODULE ptrVal; \
  90. m_mapDLL.GetNextAssoc(pos, strKey, (void*&)ptrVal); \
  91. if (ptrVal) \
  92. { \
  93. TRACE1("卸载动态库:%s\n", strKey); \
  94. ::FreeLibrary(ptrVal); \
  95. } \
  96. } \
  97. m_mapDLL.RemoveAll(); \
  98. va_list nameList; \
  99. va_start(nameList, nCnt); \
  100. UINT i = 0; \
  101. HMODULE hModule = NULL; \
  102. CString strName, strPath, strFile; \
  103. strPath = szPath; \
  104. while(i < nCnt) \
  105. { \
  106. strName = va_arg(nameList, LPCTSTR); \
  107. strFile = strPath + strName; \
  108. hModule = ::LoadLibrary(strFile); \
  109. m_mapDLL.SetAt(strName, hModule); \
  110. TRACE2("加载动态库:%s -> %d\n", strFile, hModule); \
  111. i++; \
  112. } \
  113. bool bOk = true;
  114. // C标准导出版
  115. #define INIT_DLL_FUNCTION_MULTI(function_name, dll_name) \
  116. m_mapDLL.Lookup(dll_name, (void*&)hModule); \
  117. if( NULL != hModule ) \
  118. { \
  119. function_name = (PROC_##function_name *) GetProcAddress( hModule, #function_name ); \
  120. CString strTrace; \
  121. strTrace.Format("加载函数:%s()[%d] -> %s[%d]\n", #function_name, function_name, dll_name, hModule); \
  122. TRACE0(strTrace); \
  123. } \
  124. else \
  125. { \
  126. function_name = NULL; \
  127. TRACE0("NULL\n"); \
  128. } \
  129. if(NULL == function_name) \
  130. bOk = false;
  131. // C++标准导出版
  132. #define INIT_DLL_FUNCTION_MULTI_2(function_name, function_realname, dll_name) \
  133. m_mapDLL.Lookup(dll_name, (void*&)hModule); \
  134. if( NULL != hModule ) \
  135. { \
  136. function_name = (PROC_##function_name *) GetProcAddress( hModule, #function_realname ); \
  137. CString strTrace; \
  138. strTrace.Format("加载函数:%s() - %s[%d] -> %s[%d]\n", #function_name, #function_realname, function_name, dll_name, hModule); \
  139. TRACE0(strTrace); \
  140. } \
  141. else \
  142. { \
  143. function_name = NULL; \
  144. TRACE0("NULL\n"); \
  145. } \
  146. if(NULL == function_name) \
  147. bOk = false;
  148. #define END_DLL_INIT_MULTI() \
  149. return bOk; \
  150. }