获取设备管理器的信息 - VC

本文介绍了一种通过编程方式获取计算机硬件信息的方法,利用Windows API函数如SetupDiGetClassDevs等来枚举并打印设备管理器中的硬件设备详情。

有些时候需要先获取设备管理器里面的硬件信息,才能执行对应的操作,简单的鼓捣了一下,贴出来共享。


具体有两个方法,大致来说差不多,流程一样 ,懒得整理了,直接贴出来原始体。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
// PrintDeviceInfo.cpp : 定义控制台应用程序的入口点。
//
 
#include "stdafx.h"
#include <Windows.h>
#include <setupapi.h>
 
#pragma comment(lib, "setupapi.lib")
 
void PrintDevicesInfo1()
{
 
    HDEVINFO hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_ALLCLASSES);
    if (hDevInfo == INVALID_HANDLE_VALUE)
    {
        printf("SetupDiGetClassDevs Err:%d", GetLastError());
        return ;
    };
 
    SP_CLASSIMAGELIST_DATA _spImageData = {0};
    _spImageData.cbSize = sizeof(SP_CLASSIMAGELIST_DATA);
    SetupDiGetClassImageList(&_spImageData);
 
    short wIndex = 0;
    SP_DEVINFO_DATA spDevInfoData = {0};
    spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
    while (1)
    {
        if (SetupDiEnumDeviceInfo(hDevInfo, wIndex, &spDevInfoData))
        {
            char szBuf[MAX_PATH] = {0};
            int wImageIdx = 0;
            short wItem = 0;
            if (!SetupDiGetDeviceRegistryPropertyA(hDevInfo, &spDevInfoData, SPDRP_CLASS, NULL, (PBYTE)szBuf, MAX_PATH, 0))
            {
                wIndex++;
                continue;
            };
 
            if (SetupDiGetClassImageIndex(&_spImageData, &spDevInfoData.ClassGuid, &wImageIdx))
            {
                char szName[MAX_PATH] = {0};
                DWORD dwRequireSize;
                //
                if (!SetupDiGetClassDescription(&spDevInfoData.ClassGuid, szBuf, MAX_PATH, &dwRequireSize))
                {
                    wIndex++;
                    continue;
                };
                printf("Class:%s\r\n", szBuf);
 
                if (SetupDiGetDeviceRegistryProperty(hDevInfo,&spDevInfoData, SPDRP_FRIENDLYNAME, NULL, (PBYTE)szName, MAX_PATH - 1, 0))
                {
                    printf("Device:%s\r\n\r\n", szName);
                }
                else if (SetupDiGetDeviceRegistryProperty(hDevInfo,&spDevInfoData, SPDRP_DEVICEDESC, NULL, (PBYTE)szName, MAX_PATH - 1, 0))
                {
                    printf("Device:%s\r\n\r\n", szName);
                };
            };
        }
        else
            break;
        wIndex++;
    };
 
    SetupDiDestroyClassImageList(&_spImageData);
 
}
 
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
 
    HDEVINFO hDevInfo;     
    SP_DEVINFO_DATA DeviceInfoData;     
    DWORD i;      
 
    // 得到所有设备 HDEVINFO      
    hDevInfo = SetupDiGetClassDevs(NULL, 0, 0, DIGCF_PRESENT | DIGCF_ALLCLASSES );     
 
    if (hDevInfo == INVALID_HANDLE_VALUE)     
        return 0;     
 
    // 循环列举     
    DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);     
    for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++)     
    {     
        char szClassBuf[MAX_PATH] = { 0 };
        char szDescBuf[MAX_PATH] = { 0 };
 
        // 获取类名  
        if (!SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_CLASS, NULL, (PBYTE)szClassBuf, MAX_PATH - 1, NULL))         
            continue;
 
        //获取设备描述信息
        if (!SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC, NULL, (PBYTE)szDescBuf, MAX_PATH - 1, NULL))         
            continue;
 
        printf("Class:%s\r\nDesc:%s\r\n\r\n", szClassBuf, szDescBuf);
    }     
     
    //  释放     
    SetupDiDestroyDeviceInfoList(hDevInfo);    
 
    getchar();
 
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值