关闭

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

2976人阅读 评论(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网站的观点或立场

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

获取计算机CPU序列号的方法很多,这里采用的是命令行的形式获取,可以获取CPU的序列号,很简单,直接上代码。 【1】头文件 #if !defined(AFX_14BEC153_17B9_47BE_845F_71A27BF26B59__INCLUDED_) #define AFX_14BE...
  • aoshilang2249
  • aoshilang2249
  • 2015-04-09 13:38
  • 6810

VC++获取网卡MAC、硬盘序列号、CPU ID、BIOS编号

以下代码可以取得系统特征码(网卡MAC、硬盘序列号、CPU ID、BIOS编号)     BYTE szSystemInfo[4096]; // 在程序执行完毕后,此处存储取得的系统特征码     UINT uSystemInf...
  • mayise
  • mayise
  • 2014-11-26 17:27
  • 2242

一分钟学会获取CPU序列号

        我再强调一遍,并不是所有的处理器都有序列号!Intel的文档告诉我们Pentium 4 系列的处理器不支持序列号!经过测试发现AMD的机器也没有,奇郁闷,看来这个Processor Serial Number实在用...
  • colinchan
  • colinchan
  • 2007-03-30 11:38
  • 10513

vc++ 程序获取CPU序列号

  • 2009-08-02 02:58
  • 468KB
  • 下载

JAVA获取CPU序列号

JAVA获取CPU序列号
  • y353027520dx
  • y353027520dx
  • 2015-01-07 16:08
  • 4326

DELPHI获取硬盘、CPU、网卡序列号

//引用及TYPE变量申明 uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls,nb30; {重要引用} type ...
  • u013408061
  • u013408061
  • 2017-04-19 16:30
  • 792

vc获取CPU ID

最近要用CPU序列号,MAC地址和硬盘ID来为软件加密,在网上找了下高手写的,有很多版本,但很多不能正常运行或者达不到预期效果,这里整理下自 己采用并测试通过的 CPU序列号并不是全球唯一的,以Intel为例,其不同型号的CPU序列号肯定不同,但不保证同型号的CPU序列号也各不相同,但据说P3后都是...
  • Andy20081251
  • Andy20081251
  • 2014-04-01 14:25
  • 2530

VC++获取网卡MAC、硬盘序列号、CPU ID、BIOS编号

  • 2009-06-06 22:00
  • 94KB
  • 下载

C++获取CPU序列号和C盘卷标号

主要用到两个类win32_Processor、win32_logicaldisk在MSDN中可以查看到用法和示例,这里是根据示例修改的。 #define _WIN32_DCOM #include using namespace std; #include #include # pr...
  • zouxin_88
  • zouxin_88
  • 2016-11-18 15:55
  • 2741

C#调用C++生成的dll获取CPU序列号(二)

在前面一节,我们了解了C++生成dll
  • sunny906
  • sunny906
  • 2014-07-24 11:51
  • 1489
    个人资料
    • 访问:103738次
    • 积分:2210
    • 等级:
    • 排名:第19691名
    • 原创:125篇
    • 转载:5篇
    • 译文:0篇
    • 评论:5条
    最新评论