服務核心 - 工具類

雖然類名稱為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 //

?

轉載于:https://www.cnblogs.com/99code/p/5783629.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256573.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256573.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256573.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

現代制造工程課堂筆記07——應力應變分析(考點應力莫爾圓)

目錄 選擇判斷題&#xff0c;簡單計算在莫爾圓那里出 一、單向拉伸中的應力應變 手寫筆記 選擇判斷題&#xff0c;簡單計算在莫爾圓那里出 一、單向拉伸中的應力應變 、 手寫筆記

win10+tensorflow CPU 部署CTPN環境

剛弄明白CTPN部署的時候&#xff0c;CTPN作者剛更新了簡易代碼版本&#xff0c;看介紹是把代碼優化了不需要多的配置。。。感覺好憂傷&#xff01; 源碼地址&#xff1a;https://github.com/eragonruan/text-detection-ctpn/tree/master 新版本地址&#xff1a;https://githu…

css如何實現背景透明,文字不透明?

之前做了個半透明彈層&#xff0c;但設置背景半透明時&#xff0c;子元素包含的字體及其它元素也都變成了半透明。對opacity這個屬性認識的不透徹&#xff0c;在這里做一些總結&#xff0c;方便以后使用。 背景透明&#xff0c;文字不透明的解決方法&#xff1a;為元素添加一個…

SQL Server 使用OPENROWSET訪問ORACLE遇到的各種坑總結

在SQL Server中使用OPENROWSET訪問ORACLE數據庫時&#xff0c;你可能會遇到各種坑&#xff0c;下面一一梳理一下你會遇到的一些坑。 1&#xff1a;數據庫沒有開啟"Ad Hoc Distributed Queries"選項&#xff0c;那么你就會遇到下面坑。 SELECT TOP 10 * FROM OPENROWS…

matlab——FFT傅里葉快速變換

目錄 一、自身的理解與補充 二、其他參考鏈接 一、轉載:https://blog.csdn.net/u013215903/article/details/48091359 FFT是Fast Fourier Transform(快速傅里葉變換)的簡稱,這種算法可以減少計算DFT(離散傅里葉變換,關于此更詳細的說明見后文)的時間,大大提高了運算效…

win10+tensorflow import cv2 bug解決

https://blog.csdn.net/sinat_21591675/article/details/82595812

設計理念 : popup login 在前后臺

popup 意思是一個遮罩層頂在整個網頁最前方&#xff0c;在前臺設計是這樣的&#xff0c;當用戶想在那個界面登入時&#xff0c;就可以有一個遮罩層出現。 在employer或admin&#xff08;后臺&#xff09;操作界面是同個理念&#xff0c;在所有的界面都是有control panel為根節點…

input和raw_input

12345678910python 2#!/usr/bin/env python#coding:utf-8nameraw_input("plese input you name") print namepython3#!/usr/bin/env python#coding:utf-8nameinput("plese input you name") print name本文轉自 小小三郎1 51CTO博客&#xff0c;原文鏈接…

MAATLAB GUI——回調函數的設置(Callbacks)

目錄 1.回調函數創建步驟 1)命令窗口中輸入guide,創建一個新的GUI界面窗口

是什么時候開始學習gulp了

轉自&#xff1a;http://www.ydcss.com/archives/18 簡介&#xff1a; gulp是前端開發過程中對代碼進行構建的工具&#xff0c;是自動化項目的構建利器&#xff1b;她不僅能對網站資源進行優化&#xff0c;而且在開發過程中很多重復的任務能夠使用正確的工具自動完成&#xff1…

011——數組(十一)array_merge array_merge_recursive array_change_key_case

<?php /***/ //array_merge() 將多個數組合并&#xff0c;生成新數組。當鍵名相同時&#xff0c;后者覆蓋前者 /*$array1array(weburl>"bbs.blog.com",webname>"博客"); $array2array(db_hot>"localhost",db_user>"root&qu…

matlab GUI——按下按鈕在指定的坐標下繪制函數圖像

目錄 1.組件布局 2.回調函數設置 3.編寫回調函數 1.組件布局 2.回調函數設置 右鍵單擊plot按鈕——查看回調——call backs

【轉】【UML】使用Visual Studio 2010 Team System中的架構師工具(設計與建模)

Lab 1: 應用程序建模 實驗目標 這個實驗的目的是展示如何在Visual Studio 2010旗艦版中進行應用程序建模。團隊中的架構師會通過建模確定應用程序是否滿足客戶的需求。 你可以創建不同級別的詳細模型&#xff0c;并將它們彼此結合、測試然后發布到你的開發計劃里。 在這個實驗中…

C語言:指針的幾種形式二

一、const指針 1、const int* p和int const* p:兩者意義是相同的。指向的內容是只讀數據&#xff0c;不可以q改變&#xff1b;但是指向的地址可以改變。2、int* const p&#xff1a;必須先對指針初始化&#xff0c;而且指向的地址是只讀的&#xff0c;不可以再被改變&#xff1…

深度學習基礎(一)起源

目錄 一、DP的前世 1.perceptron 2.NN 3.DP 二、DP的基礎知識 1.convolution 2.padding 3.pooling 4.Flatten 5.fully connected 6.dropout 一、DP的前世 深度學習發展至今經歷頗為曲折&#xff0c;上世紀起源&#xff0c;火熱起來也是20世紀初的時候&#xff0c;具體時…

ANSYS經典界面中梁單元實例全解析

轉載鏈接&#xff1a;http://www.jishulink.com/content/post/361389 文中紅色部分為自己添加&#xff01;&#xff01;&#xff01; 轉載的文章中提到的梁單元截面是常用的工字形&#xff0c;那么要是不規則的截面形狀的話需要自己進行截面形狀繪制&#xff0c;具體可以參考…

ant的安裝和使用

1.ant的安裝 1.1 添加環境變量&#xff1a;ANT_HOMED:\software\ant\apache-ant-1.10.1 在path中添加&#xff1a;%ANT_HOME%\bin 1.2 測試是否安裝成功 在cmd中輸入ant&#xff0c;如果出現如下提示表示安裝成功 2.定義簡單的build.xml 2.1 創建HelloWord.java package test; …

深度學習之tensorflow (一) XORerr1 -修改

博客背景是學習《深度學習之TensorFlow》這本書籍中的作業&#xff0c;修改第七章的作業&#xff0c;把XOR-異或的錯誤代碼修改為正確的。 主要修改有三個地方&#xff1a; 隱藏層一的運算從sigmoid修改為add運算&#xff1b;輸出層的運算修改為sigmoid&#xff08;原來是什么…

可調用對象

# -*- coding: utf-8 -*- #python 27 #xiaodeng #可調用對象 #http://www.cnpythoner.com/post/306.html#定義&#xff1a; #許多python對象都是可調用的&#xff0c;即&#xff1a;任何通過函數操作符()來調用的對象。 #callable()是一個布爾函數&#xff0c;確定一個對象是否…