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