MFC 获取所有USB设备 列举所有USB设备 列举所有USB HUB

本文介绍了一种使用Windows API函数来枚举系统中所有USB设备的方法,包括获取设备接口信息、设备详细信息,以及如何解析USB设备路径以提取Vendor ID (VID) 和Product ID (PID)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

获取所有USB设备,列举所有USB设备

#include <INITGUID.h> 
#include <setupapi.h>
#pragma comment(lib, "setupapi.lib") 
#define MY_USB_PID_VID    _T("VID_1111&PID_2222")

DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE,  
            0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED);  
#define   GUID_CLASS_USB_DEVICE                   GUID_DEVINTERFACE_USB_DEVICE    

DEFINE_GUID(GUID_DEVINTERFACE_USB_HUB,  
            0xf18a0e88, 0xc30c, 0x11d0, 0x88, 0x15, 0x00, 0xa0, 0xc9, 0x06, 0xbe, 0xd8);  
#define     GUID_CLASS_USB_HUB GUID_DEVINTERFACE_USB_HUB 

//枚举所有usb设备 
BOOL CMFCApplication1Dlg::EnumUSBDevice(OUT char acDevPath[MAX_PATH][MAX_PATH], OUT int &nDevNum)  
{  
    //入参检测  
    nDevNum = 0;  
    if (NULL == acDevPath)   
        return FALSE;  

    ZeroMemory(acDevPath, sizeof(acDevPath));  
    BOOL                                bRet = FALSE;  
    SP_DEVICE_INTERFACE_DATA            DeviceInterfaceData;            // 保存设备接口信息  
    DWORD                               dwRequiredSize = 0;             // 得到详细信息时需要的内存大小  
    PSP_INTERFACE_DEVICE_DETAIL_DATA    pDeviceDetailData = NULL;       // 详细信息  
    HDEVINFO                            hDeviceInfo;                    // 设备信息集合的指针      
    GUID                                InterfaceGUID = GUID_CLASS_USB_DEVICE;  
    DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);  

    // 枚举设备   
    int i = 0;  
    hDeviceInfo = SetupDiGetClassDevs(&InterfaceGUID, NULL, NULL, DIGCF_DEVICEINTERFACE|DIGCF_PRESENT);  
    if (hDeviceInfo == INVALID_HANDLE_VALUE)   
        return FALSE;  

    while (1)  
    {  
        bRet = SetupDiEnumDeviceInterfaces(hDeviceInfo, NULL, &InterfaceGUID, i++, &DeviceInterfaceData);  
        if(!bRet)    
            break;  

        // 下面需要得到Interface的详细信息  
        // 先得到详细信息需要的内存大小  
        bRet = SetupDiGetDeviceInterfaceDetail(hDeviceInfo, &DeviceInterfaceData, NULL, 0, &dwRequiredSize, NULL);  
        if(bRet)      
            break;  

        // 为详细信息分配内存  
        if(pDeviceDetailData)   
        {  
            free(pDeviceDetailData);  
            pDeviceDetailData = NULL;  
        }  
        pDeviceDetailData = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(dwRequiredSize);  
        if(pDeviceDetailData == NULL)    
            break;  

        // 得到Interface的详细信息  
        pDeviceDetailData->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);  
        SP_DEVINFO_DATA DeviceInfoData;  
        DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);  
        bRet = SetupDiGetDeviceInterfaceDetail(hDeviceInfo, &DeviceInterfaceData, pDeviceDetailData, dwRequiredSize, &dwRequiredSize,  
            &DeviceInfoData);  
        if (!bRet)    
            break;  
        strcpy(acDevPath[nDevNum], pDeviceDetailData->DevicePath);  
        nDevNum++;  
    }  
    if(pDeviceDetailData)   
    {  
        free(pDeviceDetailData);  
        pDeviceDetailData = NULL;  
    }  
    SetupDiDestroyDeviceInfoList(hDeviceInfo);  
    return TRUE;  

void CMFCApplication1Dlg::OnBnClickedButton1()
{
    CString sDevPath, svid, spid,str1,str2;
    char acDevPath[MAX_PATH][MAX_PATH];
    int nDevNum = 0;
    if(EnumUSBDevice(acDevPath, nDevNum))
    {
        
        for (int i=0; i<nDevNum; i++)  
        {
            //解析usb设备路径中的vid和pid
            sDevPath =acDevPath[i];
            sDevPath = sDevPath.Right(sDevPath.GetLength()-sDevPath.Find('#')-1);
            sDevPath = sDevPath.Left(sDevPath.Find('#'));
            svid = sDevPath.Left(sDevPath.Find('&'));
            svid = svid.Right(svid.GetLength()-4);
            spid = sDevPath.Right(sDevPath.GetLength()-sDevPath.Find('&')-1);
            spid = spid.Right(spid.GetLength()-4);

            str1 += svid;

            str1 += "|";

            str2 += spid;

            str2 += "|";  

     }    

        AfxMessageBox(str1);
        AfxMessageBox(str2);

  } 

}

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值