诸暨麻将添加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.
 
 
 
 
 
 

316 lines
8.1 KiB

  1. #include "StdAfx.h"
  2. #include "WHService.h"
  3. #include "WHEncrypt.h"
  4. //////////////////////////////////////////////////////////////////////////////////
  5. //压缩文件
  6. #include "zlib\ZLib.h"
  7. //链接文件
  8. #ifndef _DEBUG
  9. #pragma comment(lib,"Version")
  10. #pragma comment(lib,"zlib\\Release\\zip.lib")
  11. #else
  12. #pragma comment(lib,"Version")
  13. #pragma comment(lib,"zlib\\Debug\\zip.lib")
  14. #endif
  15. //////////////////////////////////////////////////////////////////////////////////
  16. //状态信息
  17. struct tagAstatInfo
  18. {
  19. ADAPTER_STATUS AdapterStatus; //网卡状态
  20. NAME_BUFFER NameBuff[16]; //名字缓冲
  21. };
  22. //////////////////////////////////////////////////////////////////////////////////
  23. //构造函数
  24. CWHService::CWHService()
  25. {
  26. }
  27. //拷贝字符
  28. bool CWHService::SetClipboardString(LPCTSTR pszString)
  29. {
  30. //变量定义
  31. HANDLE hData = NULL;
  32. BOOL bOpenClopboard = FALSE;
  33. //执行逻辑
  34. __try
  35. {
  36. //打开拷贝
  37. bOpenClopboard = OpenClipboard(AfxGetMainWnd()->m_hWnd);
  38. if (bOpenClopboard == FALSE) __leave;
  39. //清空拷贝
  40. if (EmptyClipboard() == FALSE) __leave;
  41. //申请内存
  42. HANDLE hData = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, CountStringBuffer(pszString));
  43. if (hData == NULL) __leave;
  44. //复制数据
  45. lstrcpy((LPTSTR)GlobalLock(hData), pszString);
  46. GlobalUnlock(hData);
  47. //设置数据
  48. #ifndef _UNICODE
  49. ::SetClipboardData(CF_TEXT, hData);
  50. #else
  51. ::SetClipboardData(CF_UNICODETEXT, hData);
  52. #endif
  53. }
  54. //终止程序
  55. __finally
  56. {
  57. //释放内存
  58. if (hData != NULL) GlobalUnlock(hData);
  59. //关闭拷贝
  60. if (bOpenClopboard == TRUE) CloseClipboard();
  61. //错误判断
  62. if (AbnormalTermination() == TRUE)
  63. {
  64. ASSERT(FALSE);
  65. }
  66. }
  67. return true;
  68. }
  69. //机器标识
  70. bool CWHService::GetMachineID(TCHAR szMachineID[LEN_MACHINE_ID])
  71. {
  72. //变量定义
  73. TCHAR szMACAddress[LEN_NETWORK_ID] = TEXT("");
  74. //网卡标识
  75. GetMACAddress(szMACAddress);
  76. //转换信息
  77. ASSERT(LEN_MACHINE_ID >= LEN_MD5);
  78. CWHEncrypt::MD5Encrypt(szMACAddress, szMachineID);
  79. return true;
  80. }
  81. //机器标识
  82. bool CWHService::GetMachineIDEx(TCHAR szMachineID[LEN_MACHINE_ID])
  83. {
  84. //变量定义
  85. TCHAR szMACAddress[LEN_NETWORK_ID] = TEXT("");
  86. //网卡标识
  87. WORD wMacSize = GetMACAddress(szMACAddress);
  88. //硬盘标识
  89. DWORD *pbuf = (DWORD*)szMACAddress;
  90. WORD wIndex = (wMacSize + sizeof(DWORD)-1) / sizeof(DWORD);
  91. LPCTSTR pszHardDisk[] = { TEXT("C:\\"), TEXT("D:\\"), TEXT("E:\\") };
  92. for (WORD i = wIndex; i<CountArray(pszHardDisk); i++)
  93. {
  94. ASSERT(CountArray(pszHardDisk)>(i - wIndex));
  95. GetVolumeInformation(pszHardDisk[i - wIndex], NULL, 0, pbuf + i, NULL, NULL, 0, NULL);
  96. }
  97. //转换信息
  98. ASSERT(LEN_MACHINE_ID >= LEN_MD5);
  99. CWHEncrypt::MD5Encrypt(szMACAddress, szMachineID);
  100. return true;
  101. }
  102. //网卡地址
  103. bool CWHService::GetMACAddress(TCHAR szMACAddress[LEN_NETWORK_ID])
  104. {
  105. //变量定义
  106. HINSTANCE hInstance = NULL;
  107. //执行逻辑
  108. __try
  109. {
  110. //加载 DLL
  111. hInstance = LoadLibrary(TEXT("NetApi32.dll"));
  112. if (hInstance == NULL) __leave;
  113. //获取函数
  114. typedef BYTE __stdcall NetBiosProc(NCB * Ncb);
  115. NetBiosProc * pNetBiosProc = (NetBiosProc *)GetProcAddress(hInstance, "Netbios");
  116. if (pNetBiosProc == NULL) __leave;
  117. //变量定义
  118. NCB Ncb;
  119. LANA_ENUM LanaEnum;
  120. ZeroMemory(&Ncb, sizeof(Ncb));
  121. ZeroMemory(&LanaEnum, sizeof(LanaEnum));
  122. //枚举网卡
  123. Ncb.ncb_command = NCBENUM;
  124. Ncb.ncb_length = sizeof(LanaEnum);
  125. Ncb.ncb_buffer = (BYTE *)&LanaEnum;
  126. if ((pNetBiosProc(&Ncb) != NRC_GOODRET) || (LanaEnum.length == 0)) __leave;
  127. //获取地址
  128. if (LanaEnum.length > 0)
  129. {
  130. //变量定义
  131. tagAstatInfo Adapter;
  132. ZeroMemory(&Adapter, sizeof(Adapter));
  133. //重置网卡
  134. Ncb.ncb_command = NCBRESET;
  135. Ncb.ncb_lana_num = LanaEnum.lana[0];
  136. if (pNetBiosProc(&Ncb) != NRC_GOODRET) __leave;
  137. //获取状态
  138. Ncb.ncb_command = NCBASTAT;
  139. Ncb.ncb_length = sizeof(Adapter);
  140. Ncb.ncb_buffer = (BYTE *)&Adapter;
  141. Ncb.ncb_lana_num = LanaEnum.lana[0];
  142. strcpy((char *)Ncb.ncb_callname, "*");
  143. if (pNetBiosProc(&Ncb) != NRC_GOODRET) __leave;
  144. //获取地址
  145. for (INT i = 0; i < 6; i++)
  146. {
  147. ASSERT((i * 2) < LEN_NETWORK_ID);
  148. _stprintf(&szMACAddress[i * 2], TEXT("%02X"), Adapter.AdapterStatus.adapter_address[i]);
  149. }
  150. }
  151. }
  152. //结束清理
  153. __finally
  154. {
  155. //释放资源
  156. if (hInstance != NULL)
  157. {
  158. FreeLibrary(hInstance);
  159. hInstance = NULL;
  160. }
  161. //错误断言
  162. if (AbnormalTermination() == TRUE)
  163. {
  164. ASSERT(FALSE);
  165. }
  166. }
  167. return true;
  168. }
  169. //注销热键
  170. bool CWHService::UnRegisterHotKey(HWND hWnd, UINT uKeyID)
  171. {
  172. //注销热键
  173. BOOL bSuccess = ::UnregisterHotKey(hWnd, uKeyID);
  174. return (bSuccess == TRUE) ? true : false;
  175. }
  176. //注册热键
  177. bool CWHService::RegisterHotKey(HWND hWnd, UINT uKeyID, WORD wHotKey)
  178. {
  179. //变量定义
  180. BYTE cbModifiers = 0;
  181. if (HIBYTE(wHotKey)&HOTKEYF_ALT) cbModifiers |= MOD_ALT;
  182. if (HIBYTE(wHotKey)&HOTKEYF_SHIFT) cbModifiers |= MOD_SHIFT;
  183. if (HIBYTE(wHotKey)&HOTKEYF_CONTROL) cbModifiers |= MOD_CONTROL;
  184. //注册热键
  185. BOOL bSuccess = ::RegisterHotKey(hWnd, uKeyID, cbModifiers, LOBYTE(wHotKey));
  186. return (bSuccess == TRUE) ? true : false;
  187. }
  188. //进程目录
  189. bool CWHService::GetWorkDirectory(TCHAR szWorkDirectory[], WORD wBufferCount)
  190. {
  191. //模块路径
  192. TCHAR szModulePath[MAX_PATH] = TEXT("");
  193. GetModuleFileName(AfxGetInstanceHandle(), szModulePath, CountArray(szModulePath));
  194. //分析文件
  195. for (INT i = lstrlen(szModulePath); i >= 0; i--)
  196. {
  197. if (szModulePath[i] == TEXT('\\'))
  198. {
  199. szModulePath[i] = 0;
  200. break;
  201. }
  202. }
  203. //设置结果
  204. ASSERT(szModulePath[0] != 0);
  205. lstrcpyn(szWorkDirectory, szModulePath, wBufferCount);
  206. return true;
  207. }
  208. //文件版本
  209. bool CWHService::GetModuleVersion(LPCTSTR pszModuleName, DWORD & dwVersionInfo)
  210. {
  211. //设置结果
  212. dwVersionInfo = 0L;
  213. //接收缓冲
  214. BYTE cbInfoBuffer[1024];
  215. ZeroMemory(cbInfoBuffer, sizeof(cbInfoBuffer));
  216. //模块信息
  217. DWORD dwFileHandle = NULL;
  218. if (GetFileVersionInfo(pszModuleName, dwFileHandle, sizeof(cbInfoBuffer), cbInfoBuffer) == FALSE) return false;
  219. //获取信息
  220. UINT uQuerySize = 0;
  221. VS_FIXEDFILEINFO * pFixedFileInfo = NULL;
  222. if (VerQueryValue(cbInfoBuffer, TEXT("\\"), (VOID * *)&pFixedFileInfo, &uQuerySize) == FALSE) return false;
  223. //设置结果
  224. if ((pFixedFileInfo != NULL) && (uQuerySize == sizeof(VS_FIXEDFILEINFO)))
  225. {
  226. //设置版本
  227. WORD wVersion1 = HIWORD(pFixedFileInfo->dwFileVersionMS);
  228. WORD wVersion2 = LOWORD(pFixedFileInfo->dwFileVersionMS);
  229. WORD wVersion3 = HIWORD(pFixedFileInfo->dwFileVersionLS);
  230. WORD wVersion4 = LOWORD(pFixedFileInfo->dwFileVersionLS);
  231. dwVersionInfo = MAKELONG(MAKEWORD(wVersion4, wVersion3), MAKEWORD(wVersion2, wVersion1));
  232. return true;
  233. }
  234. return false;
  235. }
  236. //压缩数据
  237. ULONG CWHService::CompressData(LPBYTE pcbSourceData, ULONG lSourceSize, BYTE cbResultData[], ULONG lResultSize)
  238. {
  239. //压缩数据
  240. if (compress(cbResultData, &lResultSize, pcbSourceData, lSourceSize) == 0L)
  241. {
  242. return lResultSize;
  243. }
  244. return 0L;
  245. }
  246. //解压数据
  247. ULONG CWHService::UnCompressData(LPBYTE pcbSourceData, ULONG lSourceSize, BYTE cbResultData[], ULONG lResultSize)
  248. {
  249. //解压数据
  250. if (uncompress(cbResultData, &lResultSize, pcbSourceData, lSourceSize) == 0L)
  251. {
  252. return lResultSize;
  253. }
  254. return 0L;
  255. }
  256. //////////////////////////////////////////////////////////////////////////////////