#pragma once #include namespace OTSController { //extern COTSUtilityExport* g_LpUtilityTools; //extern CString csLogData; #ifdef AMICS_WINAPI #undef AMICS_WINAPI #endif #define AMICS_WINAPI WINAPI #define DECLARE_FUNCTION_BEGIN(FuncName) \ if (m_dllHandle)\ {\ if (!m_fn##FuncName)\ {\ m_fn##FuncName = (FUNC_##FuncName)GetProcAddress(m_dllHandle, #FuncName);\ }\ if (m_fn##FuncName)\ {\ #define DECLARE_FUNCTION_END(FuncName) \ }\ if (SUCCEEDED(m_nLastReturn))\ {\ return true;\ }\ }\ return false; #define DECLARE_FUNCTION0(FuncName) \ protected: \ typedef int (AMICS_WINAPI* FUNC_##FuncName)(); \ FUNC_##FuncName m_fn##FuncName; \ public: \ bool FuncName() \ { \ DECLARE_FUNCTION_BEGIN(FuncName) \ m_nLastReturn = m_fn##FuncName(); \ DECLARE_FUNCTION_END(FuncName) \ } #define DECLARE_FUNCTION1(FuncName, Param1) \ protected: \ typedef int (AMICS_WINAPI* FUNC_##FuncName)(Param1); \ FUNC_##FuncName m_fn##FuncName; \ public: \ bool FuncName(Param1 p1) \ { \ DECLARE_FUNCTION_BEGIN(FuncName) \ m_nLastReturn = m_fn##FuncName(p1); \ DECLARE_FUNCTION_END(FuncName) \ } #define DECLARE_FUNCTION2(FuncName, Param1, Param2) \ protected: \ typedef int (AMICS_WINAPI* FUNC_##FuncName)(Param1, Param2); \ FUNC_##FuncName m_fn##FuncName; \ public: \ bool FuncName(Param1 p1, Param2 p2) \ { \ DECLARE_FUNCTION_BEGIN(FuncName) \ m_nLastReturn = m_fn##FuncName(p1, p2); \ DECLARE_FUNCTION_END(FuncName) \ } #define DECLARE_FUNCTION3(FuncName, Param1, Param2, Param3) \ protected: \ typedef int (AMICS_WINAPI* FUNC_##FuncName)(Param1, Param2, Param3); \ FUNC_##FuncName m_fn##FuncName; \ public: \ bool FuncName(Param1 p1, Param2 p2, Param3 p3) \ { \ DECLARE_FUNCTION_BEGIN(FuncName) \ m_nLastReturn = m_fn##FuncName(p1, p2, p3); \ DECLARE_FUNCTION_END(FuncName) \ } #define DECLARE_FUNCTION4(FuncName, Param1, Param2, Param3, Param4) \ protected: \ typedef int (AMICS_WINAPI* FUNC_##FuncName)(Param1, Param2, Param3, Param4); \ FUNC_##FuncName m_fn##FuncName; \ public: \ bool FuncName(Param1 p1, Param2 p2, Param3 p3, Param4 p4) \ { \ DECLARE_FUNCTION_BEGIN(FuncName) \ m_nLastReturn = m_fn##FuncName(p1, p2, p3, p4); \ DECLARE_FUNCTION_END(FuncName) \ } #define DECLARE_FUNCTION5(FuncName, Param1, Param2, Param3, Param4, Param5) \ protected: \ typedef int (AMICS_WINAPI* FUNC_##FuncName)(Param1, Param2, Param3, Param4, Param5); \ FUNC_##FuncName m_fn##FuncName; \ public: \ bool FuncName(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) \ { \ DECLARE_FUNCTION_BEGIN(FuncName) \ m_nLastReturn = m_fn##FuncName(p1, p2, p3, p4, p5); \ DECLARE_FUNCTION_END(FuncName) \ } #define DECLARE_FUNCTION6(FuncName, Param1, Param2, Param3, Param4, Param5, Param6) \ protected: \ typedef int (AMICS_WINAPI* FUNC_##FuncName)(Param1, Param2, Param3, Param4, Param5, Param6); \ FUNC_##FuncName m_fn##FuncName; \ public: \ bool FuncName(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) \ { \ DECLARE_FUNCTION_BEGIN(FuncName) \ m_nLastReturn = m_fn##FuncName(p1, p2, p3, p4, p5, p6); \ DECLARE_FUNCTION_END(FuncName) \ } #define DECLARE_FUNCTION7(FuncName, Param1, Param2, Param3, Param4, Param5, Param6, Param7) \ protected: \ typedef int (AMICS_WINAPI* FUNC_##FuncName)(Param1, Param2, Param3, Param4, Param5, Param6, Param7); \ FUNC_##FuncName m_fn##FuncName; \ public: \ bool FuncName(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) \ { \ DECLARE_FUNCTION_BEGIN(FuncName) \ m_nLastReturn = m_fn##FuncName(p1, p2, p3, p4, p5, p6, p7); \ DECLARE_FUNCTION_END(FuncName) \ } #define DECLARE_FUNCTION8(FuncName, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8) \ protected: \ typedef int (AMICS_WINAPI* FUNC_##FuncName)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8); \ FUNC_##FuncName m_fn##FuncName; \ public: \ bool FuncName(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) \ { \ DECLARE_FUNCTION_BEGIN(FuncName) \ m_nLastReturn = m_fn##FuncName(p1, p2, p3, p4, p5, p6, p7, p8); \ DECLARE_FUNCTION_END(FuncName) \ } //declare constructors and LoadFunctions #define DECLARE_CLASS_BEGIN(ClassName) \ public: \ ClassName () \ { #define INIT_FUNCTION(FuncName) m_fn##FuncName = nullptr; #define DECLARE_CLASS_END } class DllBase { protected: HINSTANCE m_dllHandle; CString m_dllName; long m_nLastReturn; BOOL m_bLogError; public: DllBase() : m_dllHandle(nullptr) , m_dllName(_T("")) , m_nLastReturn(0) , m_bLogError(TRUE) { } virtual ~DllBase() { FreeDll(); } LPCTSTR GetDllName() { return m_dllName; } HINSTANCE GetHandle() { return m_dllHandle; } long GetLastReturn() { return m_nLastReturn; } void SetLogError(const BOOL a_bShow = TRUE) { m_bLogError = a_bShow; } //A NULL here means the name has already been set bool LoadDll(LPCTSTR name) { //try to load #ifdef _AFXDLL m_dllHandle = AfxLoadLibrary(name); #else m_dllHandle = LoadLibrary(name); #endif LogTrace(__FILE__, __LINE__, " AfxLoadLibrary DllName = [%s] End ", name); if (!m_dllHandle) { //show warning here if needed m_dllName = _T(""); DWORD errCode = GetLastError(); LogErrorTrace(__FILE__, __LINE__, "LoadLibrary [%s] failed, return ErrorCode %d.", (LPCTSTR)name, errCode); return false; } else { m_dllName = name; LogTrace(__FILE__, __LINE__, " LoadLibrary [%s] Success", (LPCTSTR)m_dllName); } return true; } bool FreeDll() { bool bRet = true; if (m_dllHandle) { #ifdef _AFXDLL bRet = AfxFreeLibrary(m_dllHandle) ? true : false; #else bRet = FreeLibrary(m_dllHandle) ? true : false; #endif m_dllHandle = nullptr; // LogTrace(_T("FreeLibrary %s."), (LPCTSTR)m_dllName); LogTrace(__FILE__, __LINE__, "FreeLibrary %s.", (LPCTSTR)m_dllName); m_dllName = _T(""); } else { // LogTrace(_T("No valid dll to free.")); LogTrace(__FILE__, __LINE__, "No valid dll to free."); } return bRet; } }; }