C++获取系统硬件信息

利用windows wmi api,需要通过COM调用
官方实例:Example: Creating a WMI Application
Invoking a Synchronous Query

基本思路是:调用IWbemServices::ExecQuery方法,通过WQL语法(SQL for WMI)查询关键字获取相应的设备信息类(关键字就是类名),然后调用IWbemClassObject::Get获取设备信息类的属性。
使用ExecQuery查询时,尽量不要用"SELECT * FROM class"的方式,星号代表遍历class的所有属性,这会导致ExecQuery的耗时较长。如,实测"SELECT ProcessorId FROM Win32_Processor"耗时<1ms,而"SELECT * FROM Win32_Processor"耗时>1000ms!当然也可以同时查询多个属性,格式为"SELECT property_1, property_2, property_3 FROM class",速度也很快的。

msdn提供了所有的设备信息类说明,下面分析一些常用的类。

CPU:Win32_Processor
AddressWidth,位宽,32或64
Architecture,架构,x86 (0) 、MIPS (1)、Alpha (2)、PowerPC (3)、ia64 (6)、x64 (9)
MaxClockSpeed,最高时钟频率
CurrentClockSpeed,当前时钟频率
CurrentVoltage,当前电压
Family, 系列名,如8086 (3)、Intel® Core™ i7 processor (198)、Intel® Core™ i5 processor (205)、Intel® Core™ i3 processor (206)
L2CacheSize、L2CacheSpeed,L2参数
L3CacheSize、L3CacheSpeed,L3参数
Manufacturer,制造商名
Name,CPU名称
NumberOfCores,物理核数
NumberOfLogicalProcessors,逻辑核数
ProcessorId,CPUID指令的值,大小为2个DWORD
SerialNumber,序列号,Windows Server 2016 和 Windows 10之后新添加的属性

主板:Win32_BaseBoard
Manufacturer,制造商名
Name,主板名称
SerialNumber,序列号
InstallDate,安装日期

BIOS:Win32_BIOS
Manufacturer,制造商名
Name,BIOS名称
Version,BIOS版本
SerialNumber,序列号
InstallDate,安装日期
SMBIOSBIOSVersion, SMBIOS版本

网卡:Win32_NetworkAdapter
Manufacturer,制造商名
Name,网卡名称

网络设置:Win32_NetworkAdapterConfiguration
Description,网络描述(网卡名称)
MACAddress,MAC地址
IPEnabled, 判断网卡是否绑定并使能了TCP/IP,用于过滤无关的网络设备

内存:Win32_PhysicalMemory
Manufacturer,制造商名
SerialNumber,序列号
Capacity,内存大小,单位B,注意msdn给的是uint64类型,实际发现是字符串类型,官方文档有误
DataWidth, 位宽
Speed, 带宽
Model,型号

内存管理器:Win32_PhysicalMemoryArray
MaxCapacity,最大可安装内存,单位KB

硬盘:Win32_DiskDrive
Manufacturer,制造商名
SerialNumber,序列号
Model,型号
Size,容量,单位B,注意msdn给的是uint64类型,实际发现是字符串类型,官方文档有误

你可能感兴趣的:(C/C++,电脑应用)