OTSDllBase.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. #pragma once
  2. #include <windows.h>
  3. namespace OTSController {
  4. //extern COTSUtilityExport* g_LpUtilityTools;
  5. //extern CString csLogData;
  6. #ifdef AMICS_WINAPI
  7. #undef AMICS_WINAPI
  8. #endif
  9. #define AMICS_WINAPI WINAPI
  10. #define DECLARE_FUNCTION_BEGIN(FuncName) \
  11. if (m_dllHandle)\
  12. {\
  13. if (!m_fn##FuncName)\
  14. {\
  15. m_fn##FuncName = (FUNC_##FuncName)GetProcAddress(m_dllHandle, #FuncName);\
  16. }\
  17. if (m_fn##FuncName)\
  18. {\
  19. #define DECLARE_FUNCTION_END(FuncName) \
  20. }\
  21. if (SUCCEEDED(m_nLastReturn))\
  22. {\
  23. return true;\
  24. }\
  25. }\
  26. return false;
  27. #define DECLARE_FUNCTION0(FuncName) \
  28. protected: \
  29. typedef int (AMICS_WINAPI* FUNC_##FuncName)(); \
  30. FUNC_##FuncName m_fn##FuncName; \
  31. public: \
  32. bool FuncName() \
  33. { \
  34. DECLARE_FUNCTION_BEGIN(FuncName) \
  35. m_nLastReturn = m_fn##FuncName(); \
  36. DECLARE_FUNCTION_END(FuncName) \
  37. }
  38. #define DECLARE_FUNCTION1(FuncName, Param1) \
  39. protected: \
  40. typedef int (AMICS_WINAPI* FUNC_##FuncName)(Param1); \
  41. FUNC_##FuncName m_fn##FuncName; \
  42. public: \
  43. bool FuncName(Param1 p1) \
  44. { \
  45. DECLARE_FUNCTION_BEGIN(FuncName) \
  46. m_nLastReturn = m_fn##FuncName(p1); \
  47. DECLARE_FUNCTION_END(FuncName) \
  48. }
  49. #define DECLARE_FUNCTION2(FuncName, Param1, Param2) \
  50. protected: \
  51. typedef int (AMICS_WINAPI* FUNC_##FuncName)(Param1, Param2); \
  52. FUNC_##FuncName m_fn##FuncName; \
  53. public: \
  54. bool FuncName(Param1 p1, Param2 p2) \
  55. { \
  56. DECLARE_FUNCTION_BEGIN(FuncName) \
  57. m_nLastReturn = m_fn##FuncName(p1, p2); \
  58. DECLARE_FUNCTION_END(FuncName) \
  59. }
  60. #define DECLARE_FUNCTION3(FuncName, Param1, Param2, Param3) \
  61. protected: \
  62. typedef int (AMICS_WINAPI* FUNC_##FuncName)(Param1, Param2, Param3); \
  63. FUNC_##FuncName m_fn##FuncName; \
  64. public: \
  65. bool FuncName(Param1 p1, Param2 p2, Param3 p3) \
  66. { \
  67. DECLARE_FUNCTION_BEGIN(FuncName) \
  68. m_nLastReturn = m_fn##FuncName(p1, p2, p3); \
  69. DECLARE_FUNCTION_END(FuncName) \
  70. }
  71. #define DECLARE_FUNCTION4(FuncName, Param1, Param2, Param3, Param4) \
  72. protected: \
  73. typedef int (AMICS_WINAPI* FUNC_##FuncName)(Param1, Param2, Param3, Param4); \
  74. FUNC_##FuncName m_fn##FuncName; \
  75. public: \
  76. bool FuncName(Param1 p1, Param2 p2, Param3 p3, Param4 p4) \
  77. { \
  78. DECLARE_FUNCTION_BEGIN(FuncName) \
  79. m_nLastReturn = m_fn##FuncName(p1, p2, p3, p4); \
  80. DECLARE_FUNCTION_END(FuncName) \
  81. }
  82. #define DECLARE_FUNCTION5(FuncName, Param1, Param2, Param3, Param4, Param5) \
  83. protected: \
  84. typedef int (AMICS_WINAPI* FUNC_##FuncName)(Param1, Param2, Param3, Param4, Param5); \
  85. FUNC_##FuncName m_fn##FuncName; \
  86. public: \
  87. bool FuncName(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) \
  88. { \
  89. DECLARE_FUNCTION_BEGIN(FuncName) \
  90. m_nLastReturn = m_fn##FuncName(p1, p2, p3, p4, p5); \
  91. DECLARE_FUNCTION_END(FuncName) \
  92. }
  93. #define DECLARE_FUNCTION6(FuncName, Param1, Param2, Param3, Param4, Param5, Param6) \
  94. protected: \
  95. typedef int (AMICS_WINAPI* FUNC_##FuncName)(Param1, Param2, Param3, Param4, Param5, Param6); \
  96. FUNC_##FuncName m_fn##FuncName; \
  97. public: \
  98. bool FuncName(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) \
  99. { \
  100. DECLARE_FUNCTION_BEGIN(FuncName) \
  101. m_nLastReturn = m_fn##FuncName(p1, p2, p3, p4, p5, p6); \
  102. DECLARE_FUNCTION_END(FuncName) \
  103. }
  104. #define DECLARE_FUNCTION7(FuncName, Param1, Param2, Param3, Param4, Param5, Param6, Param7) \
  105. protected: \
  106. typedef int (AMICS_WINAPI* FUNC_##FuncName)(Param1, Param2, Param3, Param4, Param5, Param6, Param7); \
  107. FUNC_##FuncName m_fn##FuncName; \
  108. public: \
  109. bool FuncName(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) \
  110. { \
  111. DECLARE_FUNCTION_BEGIN(FuncName) \
  112. m_nLastReturn = m_fn##FuncName(p1, p2, p3, p4, p5, p6, p7); \
  113. DECLARE_FUNCTION_END(FuncName) \
  114. }
  115. #define DECLARE_FUNCTION8(FuncName, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8) \
  116. protected: \
  117. typedef int (AMICS_WINAPI* FUNC_##FuncName)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8); \
  118. FUNC_##FuncName m_fn##FuncName; \
  119. public: \
  120. bool FuncName(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) \
  121. { \
  122. DECLARE_FUNCTION_BEGIN(FuncName) \
  123. m_nLastReturn = m_fn##FuncName(p1, p2, p3, p4, p5, p6, p7, p8); \
  124. DECLARE_FUNCTION_END(FuncName) \
  125. }
  126. //declare constructors and LoadFunctions
  127. #define DECLARE_CLASS_BEGIN(ClassName) \
  128. public: \
  129. ClassName () \
  130. {
  131. #define INIT_FUNCTION(FuncName) m_fn##FuncName = nullptr;
  132. #define DECLARE_CLASS_END }
  133. class DllBase
  134. {
  135. protected:
  136. HINSTANCE m_dllHandle;
  137. CString m_dllName;
  138. long m_nLastReturn;
  139. BOOL m_bLogError;
  140. public:
  141. DllBase()
  142. : m_dllHandle(nullptr)
  143. , m_dllName(_T(""))
  144. , m_nLastReturn(0)
  145. , m_bLogError(TRUE)
  146. {
  147. }
  148. virtual ~DllBase()
  149. {
  150. FreeDll();
  151. }
  152. LPCTSTR GetDllName()
  153. {
  154. return m_dllName;
  155. }
  156. HINSTANCE GetHandle() { return m_dllHandle; }
  157. long GetLastReturn()
  158. {
  159. return m_nLastReturn;
  160. }
  161. void SetLogError(const BOOL a_bShow = TRUE)
  162. {
  163. m_bLogError = a_bShow;
  164. }
  165. //A NULL here means the name has already been set
  166. bool LoadDll(LPCTSTR name)
  167. {
  168. //try to load
  169. #ifdef _AFXDLL
  170. m_dllHandle = AfxLoadLibrary(name);
  171. #else
  172. m_dllHandle = LoadLibrary(name);
  173. #endif
  174. LogTrace(__FILE__, __LINE__, " AfxLoadLibrary DllName = [%s] End ", name);
  175. if (!m_dllHandle)
  176. {
  177. //show warning here if needed
  178. m_dllName = _T("");
  179. DWORD errCode = GetLastError();
  180. LogErrorTrace(__FILE__, __LINE__, "LoadLibrary [%s] failed, return ErrorCode %d.", (LPCTSTR)name, errCode);
  181. return false;
  182. }
  183. else
  184. {
  185. m_dllName = name;
  186. LogTrace(__FILE__, __LINE__, " LoadLibrary [%s] Success", (LPCTSTR)m_dllName);
  187. }
  188. return true;
  189. }
  190. bool FreeDll()
  191. {
  192. bool bRet = true;
  193. if (m_dllHandle)
  194. {
  195. #ifdef _AFXDLL
  196. bRet = AfxFreeLibrary(m_dllHandle) ? true : false;
  197. #else
  198. bRet = FreeLibrary(m_dllHandle) ? true : false;
  199. #endif
  200. m_dllHandle = nullptr;
  201. // LogTrace(_T("FreeLibrary %s."), (LPCTSTR)m_dllName);
  202. LogTrace(__FILE__, __LINE__, "FreeLibrary %s.", (LPCTSTR)m_dllName);
  203. m_dllName = _T("");
  204. }
  205. else
  206. {
  207. // LogTrace(_T("No valid dll to free."));
  208. LogTrace(__FILE__, __LINE__, "No valid dll to free.");
  209. }
  210. return bRet;
  211. }
  212. };
  213. }