用SetDi系列api获得所有usb设备

来源:互联网 发布:淘宝卖中草药 编辑:程序博客网 时间:2024/06/05 03:06

首先是要引入头文件:

#include <Setupapi.h>//

#include "usbiodef.h"//包含枚举usb设备所需要的guid

#include <cfgmgr32.h>

#include <devguid.h>

#pragma comment(lib, "Setupapi.lib") //导入lib

//获得所有sub设备的集合

m_hDevInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_USB_DEVICE, NULL, NULL, DIGCF_DEVICEINTERFACE/* | DIGCF_PRESENT*/);
//m_hDevInfo = SetupDiGetClassDevs(NULL, _T("USB"), NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);

这两种方式是有区别的,第一种只能获得所有的外部设备,第二种可以获得包括usb总线在内的所有sub设备,最后一个参数如果指定DIGCF_PRESENT,则返回的只有当前可用的设备,否则返回全部。

然后用SetupDiEnumDeviceInfo(m_hDevInfo, dwIndex, &m_DevInfoData) 函数依次枚举所有的设备,SetupDiGetDeviceRegistryProperty(m_hDevInfo,&m_DevInfoData,SPDRP_SERVICE,&DataType,(byte*)szDeviceService,_countof(szDeviceService),&BufferSize) 获得你想要的设备的属性值,然后比较对应的属性值,可以判断出当前枚举的设备是否为你想要的设备,如果是,则进行你想要的操作。

CM_Get_Device_ID(m_DevInfoData.DevInst, szDeviceID, BufferSize , 0) 获取设备的ID,然后通过id用CM_Get_DevNode_Status(&nStatus, &Problem, m_DevInfoData.DevInst, 0)获取对应设备的状态,包括是否可用,是否已经被移去等。

如果你想要停用或者启用设备,可以用SetupDiSetClassInstallParams和SetupDiCallClassInstaller实现。顺便提醒一句,某些设备是存在父子关系的,你如果把父设备停了,子设备当然也用不了了,可以用CM_Get_Parent和CM_Get_Child分别获得设备的父系和子代。

用完之后别忘了用SetupDiDestroyDeviceInfoList释放设备集合。





原创粉丝点击