GetPCInfo类头文件:

 

 1 #pragma once
 2 #include <ctime>
 3 #include <fstream>
 4 #include <iphlpapi.h>
 5 #include <string>
 6 #include <Winsock2.h>
 7 #pragma comment(lib, "IPHLPAPI.lib")
 8 #pragma comment(lib, "ws2_32.lib")
 9 //电脑相关信息的结构体
10 typedef struct MAC_INFO
11 {
12     char ipAddr[16];//IP地址
13     char macAddr[32];//MAC地址
14     char hostName[MAX_PATH];//主机名
15     char domain[MAX_PATH];//域名
16     char time[20];//时间
17 
18 }MacInfo;
19 class GetPCInfos
20 {
21 public:
22     GetPCInfos();
23     ~GetPCInfos(void);
24     MacInfo GetPcInfo();
25     void GetIpAddr();//获取IP地址
26     void GetHostName();//获取主机名
27     void GetDomain();//获取域名
28     void GetTime();//获取当前时间
29     void GetMacAddr();//获取Mac地址
30     bool SaveFile();//保存文件
31     std::string GetFilePath();//获取保存文件路径
32     bool GetMacByGetAdaptersInfo(char* macOut);//获取Mac地址
33 private:
34     MacInfo m_MacInfo;//电脑信息
35     std::string m_FileName;//文件名
36     WSADATA wsa; 
37     WORD wVersionRequested; 
38 };

 

CPP文件

 

  1 #include "StdAfx.h"
  2 #include "GetPCInfos.h"
  3 
  4 GetPCInfos::GetPCInfos()
  5 {        
  6     memset(m_MacInfo.ipAddr, '\0', 16);
  7     memset(m_MacInfo.macAddr, '\0', 32);
  8     memset(m_MacInfo.hostName, '\0', MAX_PATH);
  9     memset(m_MacInfo.domain, '\0' ,20);
 10     memset(m_MacInfo.time, '\0', 20);
 11     if(WSAStartup(wVersionRequested , &wsa) !=0 )
 12         AfxMessageBox("加载套接字库失败");
 13 
 14 }
 15 
 16 GetPCInfos::~GetPCInfos(void)
 17 {
 18 }
 19 
 20 /*****************************************
 21 函 数 名:GetPcInfo
 22 功能描述:获取电脑信息
 23 输      入:无
 24 输      出:无
 25 返 回 值:MacInfo结构体。保存有电脑相关信息
 26 *****************************************/
 27 MacInfo GetPCInfos::GetPcInfo()
 28 {
 29     GetIpAddr();
 30     GetMacAddr();
 31     GetHostName();
 32     GetDomain();
 33     GetTime();
 34     wVersionRequested = MAKEWORD( 2, 0 );  
 35     return m_MacInfo;
 36 }
 37 
 38 /*****************************************
 39 函 数 名:GetHostName
 40 功能描述:获取主机名
 41 输      入:无
 42 输      出:无
 43 返 回 值:void
 44 *****************************************/
 45 void GetPCInfos::GetHostName()
 46 {
 47     struct hostent* pHost;
 48     pHost = gethostbyname("");
 49 
 50     std::string host;
 51     host += pHost->h_name;
 52     std::string domain=host.substr(0, host.find_first_of('.'));
 53 
 54     memcpy(m_MacInfo.hostName, domain.c_str(), MAX_PATH);
 55 
 56 }    
 57 
 58 /*****************************************
 59 函 数 名:GetDomain
 60 功能描述:获取域名
 61 输      入:无
 62 输      出:无
 63 返 回 值:void
 64 void GetPCInfos::GetDomain()
 65 {
 66     struct hostent * pHost;
 67     pHost = gethostbyname("");
 68     //pHost->h_name存有完整的域名信息xx.soft.com
 69 
 70     std::string host;
 71     host += pHost->h_name;
 72     std::string domain=host.substr(host.find_first_of('.')+1, host.size()-host.find_first_of('.')-1);//获取第一个·后的域名
 73     
 74     memcpy(m_MacInfo.domain, domain.c_str(), MAX_PATH);
 75 }
 76 
 77 /*****************************************
 78 函 数 名:GetIpAddr
 79 功能描述:获取电脑IP地址
 80 输      入:无
 81 输      出:无
 82 返 回 值:void
 83 void GetPCInfos::GetIpAddr()
 84 {
 85     
 86     struct hostent  *hp;
 87     struct in_addr  sa;
 88     char  *buf ;
 89     hp = gethostbyname("");//获取主机名
 90     if (hp != NULL)
 91     {
 92         memcpy (&sa, hp->h_addr_list[0],hp->h_length);//hp->addr_list[0]为hostent结构保存的多IP主机的第一个完整域名信息
 93         buf = inet_ntoa(sa);//转换成字符串形式的IP地址
 94         memcpy(m_MacInfo.ipAddr, buf, sizeof(m_MacInfo.ipAddr));
 95     }    
 96 }
 97 
 98 /*****************************************
 99 函 数 名:GetMacAddr
100 功能描述:获取MAC地址
101 输      入:无
102 输      出:无
103 返 回 值:void
104 *****************************************/
105 void GetPCInfos::GetMacAddr()
106 {
107     GetMacByGetAdaptersInfo(m_MacInfo.macAddr);
108 }
109 
110 /*****************************************
111 函 数 名:GetTime
112 功能描述:获取当前时间
113 输      入:无
114 输      出:无
115 返 回 值:void
116 *****************************************/
117 void GetPCInfos::GetTime()
118 {
119     CTime currentTime=CTime::GetCurrentTime();
120     CString currentTimeStr;
121 
122     currentTimeStr.Format(_T("%04d/%02d/%02d %02d:%02d:%02d"),
123         currentTime.GetYear(),
124         currentTime.GetMonth(),
125         currentTime.GetDay(),
126         currentTime.GetHour(),
127         currentTime.GetMinute(),
128         currentTime.GetSecond());
129 
130     memcpy(m_MacInfo.time, currentTimeStr.GetBuffer(0), 20);
131     currentTimeStr.ReleaseBuffer();
132 }
133 
134 /*****************************************
135 函 数 名:SaveFile
136 功能描述:将获取的电脑信息保存到文件
137 输      入:无
138 输      出:无
139 返 回 值:bool
140 bool GetPCInfos::SaveFile()
141 {
142     char chTempPath[MAX_PATH] = {0};
143     BOOL b= SHGetSpecialFolderPath(NULL,chTempPath,    CSIDL_INTERNET_CACHE,0);//获取特殊路径,此处获取的是ie临时文件目录。没什么用
144 
145     CString strTempPath(chTempPath);
146     std::string tempFile;
147     strTempPath += TEXT("\\");
148     tempFile=strTempPath;
149     std::string strNull;
150                 m_FileName += "MAC_" + strNull + m_MacInfo.macAddr + strNull + ".txt";
151     std::ofstream fWrite(m_FileName.c_str(),ios::binary);//,std::ios_base::app
152 
153     if (!fWrite)
154     {
155         return false;
156     }
157 
158     std::string strContent;
159     strContent += "ip:"+strNull + m_MacInfo.ipAddr + strNull + "\n";
160     strContent += "mac:"+strNull + m_MacInfo.macAddr + strNull + "\n";
161     strContent += "hostname:" + strNull + m_MacInfo.hostName + strNull + "\n";
162     strContent += "domain:" + strNull + m_MacInfo.domain + strNull + "\n";
163     strContent += "time:" + strNull + m_MacInfo.time + strNull + "\n";
164 
165 
166 
167     result=new char[strContent.size()+1];
168     memset(result,0,strContent.size()+1);
169     memcpy(result,strContent.c_str(),strContent.size());
170     result[strContent.size()] = '\0';
171     encode.SetValue(result);
172     tmpBuf = encode.ProcessData(TRUE);    
173     delete []result;
174     result=NULL;
175     strContent=tmpBuf;
176     fWrite<<strContent;
177     fWrite.close();
178 
179     return true;
180 }
181 
182 /*****************************************
183 函 数 名:GetFilePath
184 功能描述:获取保存文件的路径
185 输      入:无
186 输      出:无
187 返 回 值:string,保存文件的路径
188 *****************************************/
189 std::string GetPCInfos::GetFilePath()
190 {
191     return m_FileName;
192 }
193 
194 /*****************************************
195 函 数 名:GetMacByGetAdaptersInfo
196 功能描述:获取MAC地址
197 输      入:无
198 输      出:char * macOut,Mac地址信息
199 返 回 值: bool,是否获取到Mac地址
200 *****************************************/
201 bool GetPCInfos::GetMacByGetAdaptersInfo(char * macOut)
202 {
203     bool ret = false;
204     ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
205     PIP_ADAPTER_INFO pAdapterInfo = (IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO));
206     if(pAdapterInfo == NULL)
207         return false;
208     if(GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) 
209     {
210         free(pAdapterInfo);
211         pAdapterInfo = (IP_ADAPTER_INFO *)malloc(ulOutBufLen);
212         if (pAdapterInfo == NULL) 
213             return false;
214     }
215 
216 
217     if(GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == NO_ERROR)
218     {
219         for(PIP_ADAPTER_INFO pAdapter = pAdapterInfo; pAdapter != NULL; pAdapter = pAdapter->Next)
220         {
221             // 确保是以太网
222             if(pAdapter->Type != MIB_IF_TYPE_ETHERNET)
223                 continue;
224             // 确保MAC地址的长度为 00-00-00-00-00-00
225             if(pAdapter->AddressLength != 6)
226                 continue;
227             sprintf(macOut, "%02X-%02X-%02X-%02X-%02X-%02X",
228                 int (pAdapter->Address[0]),
229                 int (pAdapter->Address[1]),
230                 int (pAdapter->Address[2]),
231                 int (pAdapter->Address[3]),
232                 int (pAdapter->Address[4]),
233                 int (pAdapter->Address[5]));
234             ret = true;
235             break;
236         }
237     }
238 
239     free(pAdapterInfo);
240     return ret;
241 }