SetupDi 获取设备信息的两个方法

#include "stdio.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 sp_ImageData = {0};
	sp_ImageData.cbSize = sizeof(SP_CLASSIMAGELIST_DATA);
	SetupDiGetClassImageList(&sp_ImageData);

	short wIndex = 0;
	SP_DEVINFO_DATA spDevInfoData = {0};
	spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
	while (1)
	{
		if (SetupDiEnumDeviceInfo(hDevInfo, wIndex, &spDevInfoData))
		{
			TCHAR 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(&sp_ImageData, &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(&sp_ImageData);
}
int PrintDevicesInfo2()
{

	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);

		if (strcmp(szClassBuf, _T("Display")) == 0)
		{
			printf("Class:%s\r\n  Desc:%s\r\n\r\n", szClassBuf, szDescBuf);
		}
	}     

	//  释放     
	SetupDiDestroyDeviceInfoList(hDevInfo);    


	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值