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

【1】头文件

#if !defined(AFX_14BEC153_17B9_47BE_845F_71A27BF26B59__INCLUDED_)
#define AFX_14BEC153_17B9_47BE_845F_71A27BF26B59__INCLUDED_
 
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
 
#include <iostream>
#include <string>
#include <windows.h>
 
using namespace std;
 
//--------------------------------------------------------------
//						CPU序列号
//--------------------------------------------------------------
BOOL GetCpuByCmd(char *lpszCpu, int len=128);
 
 
#endif // !defined(AFX_14BEC153_17B9_47BE_845F_71A27BF26B59__INCLUDED_)

【2】CPP

#include "stdafx.h"
#include "CpuID.h"
 
 
//--------------------------------------------------------------
//						CPU序列号
//--------------------------------------------------------------
BOOL GetCpuByCmd(char *lpszCpu, int len/*=128*/)
{	
    const long MAX_COMMAND_SIZE = 10000; // 命令行输出缓冲大小	
    WCHAR szFetCmd[] = L"wmic cpu get processorid"; // 获取CPU序列号命令行	
    const string strEnSearch = "ProcessorId"; // CPU序列号的前导信息
 
    BOOL   bret = FALSE;
    HANDLE hReadPipe = NULL; //读取管道
    HANDLE hWritePipe = NULL; //写入管道	
    PROCESS_INFORMATION pi;   //进程信息	
    STARTUPINFO			si;	  //控制命令行窗口信息
    SECURITY_ATTRIBUTES sa;   //安全属性
 
    char			szBuffer[MAX_COMMAND_SIZE + 1] = { 0 }; // 放置命令行结果的输出缓冲区
    string			strBuffer;
    unsigned long	count = 0;
    long			ipos = 0;
 
    memset(&pi, 0, sizeof(pi));
    memset(&si, 0, sizeof(si));
    memset(&sa, 0, sizeof(sa));
 
    pi.hProcess = NULL;
    pi.hThread = NULL;
    si.cb = sizeof(STARTUPINFO);
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor = NULL;
    sa.bInheritHandle = TRUE;
 
    //1.0 创建管道
    bret = CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);
    if (!bret)
    {
        goto END;
    }
 
    //2.0 设置命令行窗口的信息为指定的读写管道
    GetStartupInfo(&si);
    si.hStdError = hWritePipe;
    si.hStdOutput = hWritePipe;
    si.wShowWindow = SW_HIDE; //隐藏命令行窗口
    si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
 
    //3.0 创建获取命令行的进程
    bret = CreateProcess(NULL, szFetCmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
    if (!bret)
    {
        goto END;
    }
 
    //4.0 读取返回的数据
    WaitForSingleObject(pi.hProcess, 500/*INFINITE*/);
    bret = ReadFile(hReadPipe, szBuffer, MAX_COMMAND_SIZE, &count, 0);
    if (!bret)
    {
        goto END;
    }
 
    //5.0 查找CPU序列号
    bret = FALSE;
    strBuffer = szBuffer;
    ipos = strBuffer.find(strEnSearch);
 
    if (ipos < 0) // 没有找到
    {
        goto END;
    }
    else
    {
        strBuffer = strBuffer.substr(ipos + strEnSearch.length());
    }
 
    memset(szBuffer, 0x00, sizeof(szBuffer));
    strcpy_s(szBuffer, strBuffer.c_str());
 
    //去掉中间的空格 \r \n
    int j = 0;
    for (int i = 0; i < strlen(szBuffer); i++)
    {
        if (szBuffer[i] != ' ' && szBuffer[i] != '\n' && szBuffer[i] != '\r')
        {
            lpszCpu[j] = szBuffer[i];
            j++;
        }
    }
 
    bret = TRUE;
 
END:
    //关闭所有的句柄
    CloseHandle(hWritePipe);
    CloseHandle(hReadPipe);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
 
    return(bret);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在C语言中,可以使用以下方法读取CPU硬件序列号。 首先,需要包含Windows.h头文件,并调用GetSystemInfo函数获取系统信息,其中包括CPU的相关信息。例如: ```c #include <stdio.h> #include <Windows.h> int main() { SYSTEM_INFO info; GetSystemInfo(&info); // 获取CPU序列号 DWORD cpuInfo[2] = { 0 }; __cpuid((int*)cpuInfo, 1); // 打印CPU序列号 printf("CPU序列号: %08X-%08X\n", cpuInfo[0], cpuInfo[1]); return 0; } ``` 该程序中,GetSystemInfo函数会将系统的信息存储在SYSTEM_INFO结构体中,其中包含了关于CPU信息。接下来,使用__cpuid函数读取CPU序列号,并存储在一个DWORD类型的数组cpuInfo中。最后,通过printf函数输出CPU序列号。 需要注意的是,__cpuid函数是GCC和Clang编译器提供的扩展,如果使用其他编译器,可能需要读取相应的CPU寄存器以获取硬件序列号,具体的方法可能有所不同。 这只是一种获取CPU硬件序列号的方法,具体实现还需根据操作系统和编译器的不同而有所调整。 ### 回答2: 要读取CPU硬件序列号,可以通过访问操作系统的系统管理接口或使用相应的编程语言提供的库来实现。以下是一种可能的方法: 1. 在Windows操作系统中,可以使用WMI(Windows Management Instrumentation)接口或PowerShell脚本来获取硬件序列号。例如,可以使用PowerShell脚本中的命令`Get-WmiObject Win32_Processor | Select-Object -ExpandProperty ProcessorID`来获取CPU序列号。 2. 在Linux操作系统中,可以使用命令行工具如dmidecode或lshw来获取硬件信息。例如,可以使用命令`sudo dmidecode -t processor | grep ID`来获取CPU序列号。 3. 在编程中,可以使用各种语言的库来读取硬件序列号。例如,使用Python可以使用第三方库如pyserial,wmi或psutil来获取具体硬件序列号。 需要注意的是,不同操作系统和硬件厂商可能提供不同的接口和方法来获取硬件序列号。因此,具体的实现方式可能因个人所用的操作系统和硬件而异。 ### 回答3: c是一种编程语言,可以使用它来读取CPU和其他硬件序列号。在c中,可以使用系统调用和API函数来实现这一功能。 要读取CPU序列号,可以使用以下步骤: 1. 使用<sys/sysinfo.h>头文件中的函数sysinfo()来获取系统信息。该函数会返回一个包含各种硬件和操作系统信息的结构体。 2. 从sysinfo结构体中获取cpu_id字段,这个字段包含了CPU序列号。 3. 打印或使用cpu_id字段来获取CPU序列号。 另外,还可以使用WMI(Windows Management Instrumentation)来获取硬件序列号,方法如下: 1. 引入Windows.h和Wbemidl.h头文件,以及Wbemuuid.lib库文件。 2. 初始化COM库,并通过IWbemLocator接口获取WMI服务的指针。 3. 使用IWbemServices接口打开ROOT\CIMV2命名空间。 4. 使用ExecQuery方法执行WQL查询获取硬件信息,例如查询Win32_Processor类的序列号。 5. 遍历查询结果集,获取硬件序列号并打印。 总的来说,使用c语言可以通过系统调用、API函数或WMI来读取CPU和其他硬件序列号。具体使用哪种方式取决于操作系统和需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值