服务核心 - 工具类

虽然类名称为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 //////////////////////////////////////////////////////////////////////////////////
时间: 2024-09-27 04:49:16

服务核心 - 工具类的相关文章

服务核心 - 线程类

代码对windows线程进行了很好的抽象,用面向对象的思想进行了封装,用户只用重点关注三个函数: 1.OnEventThreadRun          --线程运行函数 2.OnEventThreadStrat        --线程开始事件 3.OnEventThreadConclude  --线程结束事件 对象声明 1 //线程对象 2 class SERVICE_CORE_CLASS CWHThread 3 { 4 //状态变量 5 private: 6 volatile bool m_

Spring-Boot ? ShapeFile文件读写工具类+接口调用

一.项目目录结构树 二.项目启动 三.往指定的shp文件里写内容 (1) json数据[Post] { "name":"test", "path":"c:/test", "geom":"MULTIPOLYGON(((101.870371 25.19228,101.873633 25.188183,101.880564 25.184416,101.886808 25.186028,101.89204

单服务缓存redis工具类

import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; /** * 单服务缓存redis工具类(需要额外jar包jedis) */ public class RedisSingletonPool { private static String ip = ConfigUtil.readConfigForObject("SIN

Android中查看服务是否开启的工具类

这个也是昨天学习的,做下总结. 检查服务是否开启要写成一个工具类,方便使用,传服务的名字返回Boolean值,当然,因为需要,还要传一个上下文context. 说一下这个工具类的几个关键点: 1.方法要传context和serviceName,context用来getSystemService()操作获得ActivityManager.注意,这个方法参数要用大写的Context中的参数:Context.ACTIVITY_SERVICE,要不然会出错,还不知道哪错的,花了我10分钟的时间才知道,谨

项目ITP(四) javaweb http json 交互 in action (服务端 spring 手机端 提供各种工具类)勿喷!

前言 系列文章:[传送门] 洗了个澡,准备写篇博客.然后看书了.时间 3 7 分.我慢慢规律生活,向目标靠近.  很喜欢珍惜时间像叮当猫一样 正文 慢慢地,二维码实现签到将要落幕了.下篇文章出二维码实现签到 这次 我们实现 javaweb http json 交互 in action 题目很长,但我想让你们看下,给我点意见. 开始吧 实战 本次以经典的登录作为案例.登录做的好也是经典. 服务端 和 app端,服务端简略,app端详细介绍... 服务端 资料: <spring> @Respons

服务有关的工具类ServiceUtils

和服务有关的工具类 package com.flyou.utils; import java.util.List; import android.app.ActivityManager; import android.app.ActivityManager.RunningServiceInfo; import android.content.Context; public class ServiceUtils { /** * 判断服务是否在运行状态 * */ /** * 校验某个服务是否还活着

项目ITP(四) javaweb http json 交互 in action (服务端 spring 手机端 提供各种工具类)勿喷!

前言 系列文章:[传送门] 洗了个澡,准备写篇博客.然后看书了.时间 3 7 分.我慢慢规律生活,向目标靠近.  很喜欢珍惜时间像叮当猫一样 正文 慢慢地,二维码实现签到将要落幕了.下篇文章出二维码实现签到 这次 我们实现 javaweb http json 交互 in action 题目很长,但我想让你们看下,给我点意见. 开始吧 实战 本次以经典的登录作为案例.登录做的好也是经典. 服务端 和 app端,服务端简略,app端详细介绍... 服务端 资料: <spring> @Respons

Hibernate工具类_抽取重复核心代码

问题:在Hibernate中每次执行一次操作总是需要加载核心配置文件,获取连接池等等都是重复动作,所以抽取出来 解决: package com.xxx.utils; /** *Hibernate的工具类 *@author cxh */ import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg

RestTemplate工具类根据服务名发送请求

要使用RestTemplate 根据服务名发送请求的话需要 使用  @LoadBalanced  这个注解,用了这个注解的RestTemplate就不用使用  ip 来请求了,首先要创建一个配置类 import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.conte