1.遍历win设备,需要使用的SetUpApi
头文件:SetupAPI.h
lib:setupapi.lib
2.使用方法如下:
a.HDEVINFO SetupDiGetClassDevs(CONST GUID *ClassGuid, PCWSTR Enumerator,HWND hwndParent,,DWORD Flags)
获取所有查询设备集合。
classGuid 是需要查询的设备类guid;
Enumerator 是Pnp 设备分类(USB, USBSTOR等 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum 下面的分类;
hwndParent 直接使用NULL;
Flags 设置为DIGCF_ALLCLASSES时,GUID 设置将无效;
有如下设置:DIGCF_PRESENT、DIGCF_ALLCLASSES等。
b. BOOL SetupDiEnumDeviceInfo(HDEVINFO DeviceInfoSet, DWORD MemberIndex, PSP_DEVINFO_DATA DeviceInfoData)
获取设备集合中的第MemberIndex条数据
c. BOOL SetupDiGetDeviceRegistryProperty(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Property,PDWORD PropertyRegDataType,PBYTE PropertyBuffer,DWORD PropertyBufferSize, PDWORD RequiredSize)
获取设备中某个属性。
d.SetupDiDestroyDeviceInfoList(HDEVINFO DeviceInfoSet) 释放设备集合
示例代码如下:
#include<iostream>
#include<windows.h>
#include<SetupAPI.h>
int main(char* argv, char* argvs[])
{
HDEVINFO devSet = SetupDiGetClassDevs(NULL, L"USB", NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES);
if (devSet == INVALID_HANDLE_VALUE)
{
return -1;
}
SP_DEVINFO_DATA device;
memset(&device, 0 , sizeof(SP_DEVINFO_DATA));
device.cbSize = sizeof(SP_DEVINFO_DATA);
DWORD index = 0;
while(SetupDiEnumDeviceInfo(devSet, index, &device))
{
index++;
DWORD dataT;
WCHAR* buffer = NULL;
DWORD bufferSize = 0;
SetupDiGetDeviceRegistryProperty(devSet, &device, SPDRP_HARDWAREID, NULL, NULL, bufferSize, &bufferSize);
buffer = new WCHAR[bufferSize/2];
memset(buffer , 0, bufferSize);
SetupDiGetDeviceRegistryProperty(devSet, &device, SPDRP_HARDWAREID, NULL,(PBYTE)buffer, bufferSize, &bufferSize);
wprintf(L"%s\n", buffer);
SetupDiGetDeviceRegistryProperty(devSet, &device, SPDRP_DEVICEDESC, NULL, NULL, bufferSize, &bufferSize);
buffer = new WCHAR[bufferSize/2];
memset(buffer , 0, bufferSize);
SetupDiGetDeviceRegistryProperty(devSet, &device, SPDRP_DEVICEDESC, NULL,(PBYTE)buffer, bufferSize, &bufferSize);
wprintf(L"%s\n", buffer);
delete buffer;
}
SetupDiDestroyDeviceInfoList(devSet);
return 0;
}