诸暨麻将添加redis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

360 lines
10 KiB

  1. #ifndef MODULE_HEAD_FILE
  2. #define MODULE_HEAD_FILE
  3. //////////////////////////////////////////////////////////////////////////////////
  4. //模块接口
  5. #define VER_IUnknownEx INTERFACE_VERSION(1,1)
  6. static const GUID IID_IUnknownEx={0x5feec21e,0xdbf3,0x46f0,0x9f,0x57,0xd1,0xcd,0x71,0x1c,0x46,0xde};
  7. //基础接口
  8. interface IUnknownEx
  9. {
  10. //释放对象
  11. virtual VOID Release()=NULL;
  12. //接口查询
  13. virtual VOID * QueryInterface(REFGUID Guid, DWORD dwQueryVer)=NULL;
  14. };
  15. //////////////////////////////////////////////////////////////////////////////////
  16. //版本比较
  17. //产品版本
  18. #define BULID_VER 0 //授权版本
  19. #define PRODUCT_VER 6 //产品版本
  20. //接口版本
  21. #define INTERFACE_VERSION(cbMainVer,cbSubVer) \
  22. (DWORD)( \
  23. (((BYTE)(PRODUCT_VER))<<24)+ \
  24. (((BYTE)(cbMainVer))<<16)+ \
  25. ((BYTE)(cbSubVer)<<8))+ \
  26. ((BYTE)(BULID_VER))
  27. //模块版本
  28. #define PROCESS_VERSION(cbMainVer,cbSubVer,cbBuildVer) \
  29. (DWORD)( \
  30. (((BYTE)(PRODUCT_VER))<<24)+ \
  31. (((BYTE)(cbMainVer))<<16)+ \
  32. ((BYTE)(cbSubVer)<<8)+ \
  33. (BYTE)(cbBuildVer))
  34. //产品版本
  35. inline BYTE GetProductVer(DWORD dwVersion)
  36. {
  37. return ((BYTE *)&dwVersion)[3];
  38. }
  39. //主要版本
  40. inline BYTE GetMainVer(DWORD dwVersion)
  41. {
  42. return ((BYTE *)&dwVersion)[2];
  43. }
  44. //次要版本
  45. inline BYTE GetSubVer(DWORD dwVersion)
  46. {
  47. return ((BYTE *)&dwVersion)[1];
  48. }
  49. //编译版本
  50. inline BYTE GetBuildVer(DWORD dwVersion)
  51. {
  52. return ((BYTE *)&dwVersion)[0];
  53. }
  54. //版本比较
  55. inline bool InterfaceVersionCompare(DWORD dwQueryVer, DWORD dwInterfaceVer)
  56. {
  57. if (GetSubVer(dwQueryVer)>GetSubVer(dwInterfaceVer)) return false;
  58. if (GetMainVer(dwQueryVer)!=GetMainVer(dwInterfaceVer)) return false;
  59. if (GetBuildVer(dwQueryVer)!=GetBuildVer(dwInterfaceVer)) return false;
  60. if (GetProductVer(dwQueryVer)!=GetProductVer(dwInterfaceVer)) return false;
  61. return true;
  62. };
  63. //////////////////////////////////////////////////////////////////////////////////
  64. //内部接口查询
  65. //查询接口
  66. #define QUERYINTERFACE(Interface,Guid,dwQueryVer) \
  67. if ((Guid==IID_##Interface)&&(InterfaceVersionCompare(dwQueryVer,VER_##Interface))) \
  68. return static_cast<Interface *>(this);
  69. //查询接口
  70. #define QUERYINTERFACE_IUNKNOWNEX(BaseInterface,Guid,dwQueryVer) \
  71. if ((Guid==IID_IUnknownEx)&&(InterfaceVersionCompare(dwQueryVer,VER_IUnknownEx))) \
  72. return static_cast<IUnknownEx *>(static_cast<BaseInterface *>(this));
  73. //////////////////////////////////////////////////////////////////////////////////
  74. //外部接口查询
  75. //查询接口
  76. #define QUERY_ME_INTERFACE(Interface) \
  77. ((Interface *)QueryInterface(IID_##Interface,VER_##Interface))
  78. //查询接口
  79. #define QUERY_OBJECT_INTERFACE(Object,Interface) \
  80. ((Interface *)Object.QueryInterface(IID_##Interface,VER_##Interface))
  81. //查询接口
  82. #define QUERY_OBJECT_PTR_INTERFACE(pObject,Interface) \
  83. ((pObject==NULL)?NULL:((Interface *)pObject->QueryInterface(IID_##Interface,VER_##Interface)))
  84. //////////////////////////////////////////////////////////////////////////////////
  85. //组件模板辅助模板
  86. //组件创建函数
  87. typedef VOID * (ModuleCreateProc)(REFGUID Gudi, DWORD dwInterfaceVer);
  88. //组件辅助类模板
  89. template <typename IModeluInterface> class CTempldateHelper
  90. {
  91. //接口属性
  92. public:
  93. REFGUID m_Guid; //接口标识
  94. const DWORD m_dwVersion; //接口版本
  95. //组件属性
  96. public:
  97. CHAR m_szCreateProc[32]; //创建函数
  98. TCHAR m_szModuleDllName[MAX_PATH]; //组件名字
  99. //内核变量
  100. public:
  101. HINSTANCE m_hDllInstance; //DLL 句柄
  102. IModeluInterface * m_pIModeluInterface; //模块接口
  103. //辅助变量
  104. public:
  105. TCHAR m_szDescribe[128]; //错误描述
  106. //函数定义
  107. public:
  108. //构造函数
  109. CTempldateHelper(REFGUID Guid, DWORD dwVersion);
  110. //构造函数
  111. CTempldateHelper(REFGUID Guid, DWORD dwVersion, LPCTSTR pszModuleDll, LPCSTR pszCreateProc);
  112. //析构函数
  113. virtual ~CTempldateHelper();
  114. //管理函数
  115. public:
  116. //释放组件
  117. bool CloseInstance();
  118. //创建函数
  119. bool CreateInstance();
  120. //配置函数
  121. public:
  122. //创建信息
  123. VOID SetModuleCreateInfo(LPCTSTR pszModuleDllName, LPCSTR pszCreateProc);
  124. //辅助函数
  125. public:
  126. //获取错误
  127. inline LPCTSTR GetErrorDescribe() const;
  128. //指针重载
  129. inline IModeluInterface * operator->() const;
  130. //获取接口
  131. inline IModeluInterface * GetInterface() const;
  132. };
  133. //////////////////////////////////////////////////////////////////////////////////
  134. // CTempldateHelper<IModeluInterface> 外联函数
  135. //构造函数
  136. template <typename IModeluInterface>
  137. CTempldateHelper<IModeluInterface>::CTempldateHelper(REFGUID Guid, DWORD dwVersion) : m_dwVersion(dwVersion), m_Guid(Guid)
  138. {
  139. //辅助变量
  140. m_szDescribe[0]=0;
  141. //内核信息
  142. m_hDllInstance=NULL;
  143. m_pIModeluInterface=NULL;
  144. //组件属性
  145. ZeroMemory(m_szCreateProc,sizeof(m_szCreateProc));
  146. ZeroMemory(m_szModuleDllName,sizeof(m_szModuleDllName));
  147. return;
  148. }
  149. //构造函数
  150. template <typename IModeluInterface>
  151. CTempldateHelper<IModeluInterface>::CTempldateHelper(REFGUID Guid, DWORD dwVersion, LPCTSTR pszModuleDll, LPCSTR pszCreateProc) : m_dwVersion(dwVersion), m_Guid(Guid)
  152. {
  153. //辅助变量
  154. m_szDescribe[0]=0;
  155. //内核信息
  156. m_hDllInstance=NULL;
  157. m_pIModeluInterface=NULL;
  158. //组件属性
  159. lstrcpynA(m_szCreateProc,pszCreateProc,CountArray(m_szCreateProc));
  160. lstrcpyn(m_szModuleDllName,pszModuleDll,CountArray(m_szModuleDllName));
  161. return;
  162. }
  163. //析构函数
  164. template <typename IModeluInterface>
  165. CTempldateHelper<IModeluInterface>::~CTempldateHelper()
  166. {
  167. CloseInstance();
  168. }
  169. //创建组件
  170. template <typename IModeluInterface>
  171. bool CTempldateHelper<IModeluInterface>::CreateInstance()
  172. {
  173. //释放组件
  174. CloseInstance();
  175. //创建组件
  176. try
  177. {
  178. //效验参数
  179. ASSERT(m_szCreateProc[0]!=0);
  180. ASSERT(m_szModuleDllName[0]!=0);
  181. //加载模块
  182. m_hDllInstance=AfxLoadLibrary(m_szModuleDllName);
  183. if (m_hDllInstance==NULL)
  184. {
  185. _sntprintf_s(m_szDescribe, CountArray(m_szDescribe), TEXT("“%s”模块加载失败"), m_szModuleDllName);
  186. return false;
  187. }
  188. //寻找函数
  189. ModuleCreateProc * CreateProc=(ModuleCreateProc *)GetProcAddress(m_hDllInstance,m_szCreateProc);
  190. if (CreateProc==NULL)
  191. {
  192. _sntprintf_s(m_szDescribe, CountArray(m_szDescribe), TEXT("找不到组件创建函数“%s”"), m_szCreateProc);
  193. return false;
  194. }
  195. //创建组件
  196. m_pIModeluInterface=(IModeluInterface *)CreateProc(m_Guid,m_dwVersion);
  197. if (m_pIModeluInterface==NULL)
  198. {
  199. _sntprintf_s(m_szDescribe, CountArray(m_szDescribe), TEXT("调用函数“%s”生成对象失败"), m_szCreateProc);
  200. return false;
  201. }
  202. }
  203. catch (LPCTSTR pszError)
  204. {
  205. _sntprintf_s(m_szDescribe, CountArray(m_szDescribe), TEXT("由于“%s”,组件创建失败"), pszError);
  206. return false;
  207. }
  208. catch (...)
  209. {
  210. _sntprintf_s(m_szDescribe, CountArray(m_szDescribe), TEXT("组件创建函数“%s”产生未知异常错误,组件创建失败"), m_szCreateProc);
  211. return false;
  212. }
  213. return true;
  214. }
  215. //释放组件
  216. template <typename IModeluInterface>
  217. bool CTempldateHelper<IModeluInterface>::CloseInstance()
  218. {
  219. //设置变量
  220. m_szDescribe[0]=0;
  221. //销毁对象
  222. if (m_pIModeluInterface!=NULL)
  223. {
  224. m_pIModeluInterface->Release();
  225. m_pIModeluInterface=NULL;
  226. }
  227. //释放 DLL
  228. if (m_hDllInstance!=NULL)
  229. {
  230. AfxFreeLibrary(m_hDllInstance);
  231. m_hDllInstance=NULL;
  232. }
  233. return true;
  234. }
  235. //创建信息
  236. template <typename IModeluInterface>
  237. VOID CTempldateHelper<IModeluInterface>::SetModuleCreateInfo(LPCTSTR pszModuleDllName, LPCSTR pszCreateProc)
  238. {
  239. //设置信息
  240. lstrcpynA(m_szCreateProc,pszCreateProc,CountArray(m_szCreateProc));
  241. lstrcpyn(m_szModuleDllName,pszModuleDllName,CountArray(m_szModuleDllName));
  242. return;
  243. }
  244. //////////////////////////////////////////////////////////////////////////////////
  245. // CTempldateHelper<IModeluInterface> 内联函数
  246. //获取描述
  247. template <typename IModeluInterface>
  248. inline LPCTSTR CTempldateHelper<IModeluInterface>::GetErrorDescribe() const
  249. {
  250. return m_szDescribe;
  251. }
  252. //指针重载
  253. template <typename IModeluInterface>
  254. inline IModeluInterface * CTempldateHelper<IModeluInterface>::operator->() const
  255. {
  256. return GetInterface();
  257. }
  258. //获取接口
  259. template <typename IModeluInterface>
  260. inline IModeluInterface * CTempldateHelper<IModeluInterface>::GetInterface() const
  261. {
  262. return m_pIModeluInterface;
  263. }
  264. //////////////////////////////////////////////////////////////////////////////////
  265. //组件辅助宏
  266. //组件创建函数
  267. #define DECLARE_CREATE_MODULE(OBJECT_NAME) \
  268. extern "C" __declspec(dllexport) VOID * Create##OBJECT_NAME(REFGUID Guid, DWORD dwInterfaceVer) \
  269. { \
  270. C##OBJECT_NAME * p##OBJECT_NAME=NULL; \
  271. try \
  272. { \
  273. p##OBJECT_NAME=new C##OBJECT_NAME(); \
  274. if (p##OBJECT_NAME==NULL) throw TEXT("创建失败"); \
  275. VOID * pObject=p##OBJECT_NAME->QueryInterface(Guid,dwInterfaceVer); \
  276. if (pObject==NULL) throw TEXT("接口查询失败"); \
  277. return pObject; \
  278. } \
  279. catch (...) {} \
  280. SafeDelete(p##OBJECT_NAME); \
  281. return NULL; \
  282. }
  283. //组件辅助类宏
  284. #define DECLARE_MODULE_DYNAMIC(OBJECT_NAME) \
  285. class C##OBJECT_NAME##Helper : public CTempldateHelper<I##OBJECT_NAME> \
  286. { \
  287. public: \
  288. C##OBJECT_NAME##Helper() : CTempldateHelper<I##OBJECT_NAME>(IID_I##OBJECT_NAME,VER_I##OBJECT_NAME) { } \
  289. };
  290. //组件辅助类宏
  291. #define DECLARE_MODULE_HELPER(OBJECT_NAME,MODULE_DLL_NAME,CREATE_FUNCTION_NAME) \
  292. class C##OBJECT_NAME##Helper : public CTempldateHelper<I##OBJECT_NAME> \
  293. { \
  294. public: \
  295. C##OBJECT_NAME##Helper() : CTempldateHelper<I##OBJECT_NAME>(IID_I##OBJECT_NAME, \
  296. VER_I##OBJECT_NAME,MODULE_DLL_NAME,CREATE_FUNCTION_NAME) { } \
  297. };
  298. //////////////////////////////////////////////////////////////////////////////////
  299. #endif