通过SetupDIxxxx系列API来查询所有usb设备的实例名称,这个名称是内部唯一的,里面用实例ID区分不同的设备,使用CreateFile打开这个实例名称即可

解决方案 »

  1.   

    usbview这个demo中的函数好像部分已经被废弃了——msdn中已经查不到文档,而是推荐用setupDi…系列函数
    其实用guid来查找特定(你关心)的设备还是非常好用的。
    SetupDiGetClassDevs获取你关心的设备的信息,他会查找当前所有连接到usb端口上的设备,
    并返回一个HDEVINFO,里面存放的就是所有你关心的设备的信息
    然后可以用SetupDiEnumDeviceInterfaces来获取其中一个设备的信息
    再用SetupDiGetInterfaceDeviceDetail来获取设备信息的数据到一个SP_INTERFACE_DEVICE_DETAIL_DATA结构体中
    PSP_INTERFACE_DEVICE_DETAIL_DATA中的devicePath就是设备的路径——也就是可以传给CreateFile的“文件名”
      

  2.   

    DEFINE_GUID(GUID_DEVINTERFACE_DISK,   0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);

    hDevInfo = SetupDiGetClassDevs((LPGUID)&GUID_DEVINTERFACE_DISK, 0, 0, DIGCF_PRESENT  | DIGCF_DEVICEINTERFACE); //
    if (hDevInfo  ==  INVALID_HANDLE_VALUE) // 查询信息失败 
    {  
    printf("ERROR - SetupDiGetClassDevs()"); // 枚举每个USB设备//--
    return       1;       
    }
      
    DeviceInfoData.cbSize  =  sizeof(SP_DEVINFO_DATA);         
    for (i = 0; SetupDiEnumDeviceInfo( hDevInfo,  i,  &DeviceInfoData ); i++ )         
    {    
    ULONG nSize;
    char buf[256];

    if ( SetupDiGetDeviceInstanceId(hDevInfo, &DeviceInfoData, buf, sizeof(buf), &nSize) )        
    {     这而获得了设备ID ,设备ID是唯一的,
    //strcpy(g_DEVICEDISK[i].USB_DECR,buf);
    DWORD DataT;
    DEVINST devInstParent;
    CM_Get_Parent(&devInstParent,DeviceInfoData.DevInst,   0);  
    CM_Get_Device_ID(devInstParent,   buf,   256, 0); 
    strcpy(g_DEVICEDISK[i].USB_VID_PID,buf);
    }
    }                               
    SetupDiDestroyDeviceInfoList(hDevInfo); 
      

  3.   

    DEFINE_GUID(GUID_DEVINTERFACE_DISK,   0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
    HDEVINFO hDevInfo;
    SP_DEVINFO_DATA  DeviceInfoData;         
    DWORD i = 0;  hDevInfo = SetupDiGetClassDevs((LPGUID)&GUID_DEVINTERFACE_DISK, 0, 0, DIGCF_PRESENT  | DIGCF_DEVICEINTERFACE); //
    if (hDevInfo  ==  INVALID_HANDLE_VALUE) // 查询信息失败 
    {  
    printf("ERROR - SetupDiGetClassDevs()"); // 枚举每个USB设备//--
    return       1;       
    }
      
    DeviceInfoData.cbSize  =  sizeof(SP_DEVINFO_DATA);         
    for (i = 0; SetupDiEnumDeviceInfo( hDevInfo,  i,  &DeviceInfoData ); i++ )         
    {    
    ULONG nSize;
    char buf[256];

    if ( SetupDiGetDeviceInstanceId(hDevInfo, &DeviceInfoData, buf, sizeof(buf), &nSize) )        
    {     //设备实例是唯一的   
    strcpy(g_DEVICEDISK[i].USB_DECR,buf);
    DWORD DataT;
    DEVINST devInstParent;
    CM_Get_Parent(&devInstParent,DeviceInfoData.DevInst,   0);  
    CM_Get_Device_ID(devInstParent,   buf,   256, 0); 
    strcpy(g_DEVICEDISK[i].USB_VID_PID,buf);
    }
    }                               
    SetupDiDestroyDeviceInfoList(hDevInfo); 
      

  4.   

    哈哈,可以成功吗?据我所知SetupDiEnumDeviceInfo反回设备的接口信息总是失败!而这个GUID
    DEFINE_GUID(GUID_DEVINTERFACE_DISK, 0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
    是电脑里面硬盘所对应的GUID如果你换成了别的GUID你有试过可以成功吗?高手请解答……