关闭

C++ 硬件信息 获取CPU序列号

1323人阅读 评论(0) 收藏 举报
分类:

 获取计算机CPU序列号的方法很多,这里采用的是命令行的形式获取,可以获取CPU的序列号,很简单,直接上代码。


【1】头文件

  1. #if !defined(AFX_14BEC153_17B9_47BE_845F_71A27BF26B59__INCLUDED_)  
  2. #define AFX_14BEC153_17B9_47BE_845F_71A27BF26B59__INCLUDED_  
  3.   
  4. #if _MSC_VER > 1000  
  5. #pragma once  
  6. #endif // _MSC_VER > 1000  
  7.   
  8. #include <iostream>  
  9. #include <string>  
  10. #include <windows.h>  
  11.   
  12. using namespace std;  
  13.   
  14. //--------------------------------------------------------------  
  15. //                      CPU序列号  
  16. //--------------------------------------------------------------  
  17. BOOL GetCpuByCmd(char *lpszCpu, int len=128);  
  18.   
  19.   
  20. #endif // !defined(AFX_14BEC153_17B9_47BE_845F_71A27BF26B59__INCLUDED_)  

【2】CPP

  1. #include "stdafx.h"  
  2. #include "CpuID.h"  
  3.   
  4.   
  5. //--------------------------------------------------------------  
  6. //                      CPU序列号  
  7. //--------------------------------------------------------------  
  8. BOOL GetCpuByCmd(char *lpszCpu, int len/*=128*/)  
  9. {     
  10.     const long MAX_COMMAND_SIZE = 10000; // 命令行输出缓冲大小     
  11.     WCHAR szFetCmd[] = L"wmic cpu get processorid"// 获取CPU序列号命令行    
  12.     const string strEnSearch = "ProcessorId"// CPU序列号的前导信息  
  13.   
  14.     BOOL   bret = FALSE;  
  15.     HANDLE hReadPipe = NULL; //读取管道  
  16.     HANDLE hWritePipe = NULL; //写入管道      
  17.     PROCESS_INFORMATION pi;   //进程信息      
  18.     STARTUPINFO         si;   //控制命令行窗口信息  
  19.     SECURITY_ATTRIBUTES sa;   //安全属性  
  20.   
  21.     char            szBuffer[MAX_COMMAND_SIZE + 1] = { 0 }; // 放置命令行结果的输出缓冲区  
  22.     string          strBuffer;  
  23.     unsigned long   count = 0;  
  24.     long            ipos = 0;  
  25.   
  26.     memset(&pi, 0, sizeof(pi));  
  27.     memset(&si, 0, sizeof(si));  
  28.     memset(&sa, 0, sizeof(sa));  
  29.   
  30.     pi.hProcess = NULL;  
  31.     pi.hThread = NULL;  
  32.     si.cb = sizeof(STARTUPINFO);  
  33.     sa.nLength = sizeof(SECURITY_ATTRIBUTES);  
  34.     sa.lpSecurityDescriptor = NULL;  
  35.     sa.bInheritHandle = TRUE;  
  36.   
  37.     //1.0 创建管道  
  38.     bret = CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);  
  39.     if (!bret)  
  40.     {  
  41.         goto END;  
  42.     }  
  43.   
  44.     //2.0 设置命令行窗口的信息为指定的读写管道  
  45.     GetStartupInfo(&si);  
  46.     si.hStdError = hWritePipe;  
  47.     si.hStdOutput = hWritePipe;  
  48.     si.wShowWindow = SW_HIDE; //隐藏命令行窗口  
  49.     si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;  
  50.   
  51.     //3.0 创建获取命令行的进程  
  52.     bret = CreateProcess(NULL, szFetCmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);  
  53.     if (!bret)  
  54.     {  
  55.         goto END;  
  56.     }  
  57.   
  58.     //4.0 读取返回的数据  
  59.     WaitForSingleObject(pi.hProcess, 500/*INFINITE*/);  
  60.     bret = ReadFile(hReadPipe, szBuffer, MAX_COMMAND_SIZE, &count, 0);  
  61.     if (!bret)  
  62.     {  
  63.         goto END;  
  64.     }  
  65.   
  66.     //5.0 查找CPU序列号  
  67.     bret = FALSE;  
  68.     strBuffer = szBuffer;  
  69.     ipos = strBuffer.find(strEnSearch);  
  70.   
  71.     if (ipos < 0) // 没有找到  
  72.     {  
  73.         goto END;  
  74.     }  
  75.     else  
  76.     {  
  77.         strBuffer = strBuffer.substr(ipos + strEnSearch.length());  
  78.     }  
  79.   
  80.     memset(szBuffer, 0x00, sizeof(szBuffer));  
  81.     strcpy_s(szBuffer, strBuffer.c_str());  
  82.   
  83.     //去掉中间的空格 \r \n  
  84.     int j = 0;  
  85.     for (int i = 0; i < strlen(szBuffer); i++)  
  86.     {  
  87.         if (szBuffer[i] != ' ' && szBuffer[i] != '\n' && szBuffer[i] != '\r')  
  88.         {  
  89.             lpszCpu[j] = szBuffer[i];  
  90.             j++;  
  91.         }  
  92.     }  
  93.   
  94.     bret = TRUE;  
  95.   
  96. END:  
  97.     //关闭所有的句柄  
  98.     CloseHandle(hWritePipe);  
  99.     CloseHandle(hReadPipe);  
  100.     CloseHandle(pi.hProcess);  
  101.     CloseHandle(pi.hThread);  
  102.   
  103.     return(bret);  
  104. }  

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:62700次
    • 积分:1814
    • 等级:
    • 排名:千里之外
    • 原创:125篇
    • 转载:5篇
    • 译文:0篇
    • 评论:5条
    最新评论