根据VID PID获取USB设备路径

 

 

#include <wtypes.h>
#include <setupapi.h>

#pragma comment(lib, "setupapi.lib")

BOOL EnumUSBDevice(WORD uVID, WORD uPID, //USB VID PID
                   BOOL bPresentFlag, //设备必须存在标志 0不需要插入设备
                   TCHAR szDevPath[MAX_PATH+1] = NULL, //设备路径
                   int iIndex=0) //第N个设备 (对多个相同的设备进行区分)
{
  BOOL bRet = FALSE;

  int iFoundCount = 0; //查找到匹配设备个数

  //
  DWORD dwFlage = DIGCF_ALLCLASSES|DIGCF_DEVICEINTERFACE;
  if(bPresentFlag) 
    dwFlage |= DIGCF_PRESENT;
  HDEVINFO hdev = SetupDiGetClassDevs(NULL, NULL, NULL, dwFlage);

  if (INVALID_HANDLE_VALUE != hdev)
  {
    SP_DEVINFO_DATA DeviceInfoData = {0};
    DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

    DWORD DeviceIndex = 0;    
    while (SetupDiEnumDeviceInfo(hdev, DeviceIndex, &DeviceInfoData)) 
    {
      DeviceIndex++;

      int idev = 0; 
      while(1)
      {
        SP_DEVICE_INTERFACE_DATA did = {0};
        did.cbSize = sizeof(did);

        if(SetupDiEnumDeviceInterfaces(hdev, NULL, &DeviceInfoData.ClassGuid, idev, &did))
        {
          idev++;
          
          DWORD cbRequired = 0;

          SetupDiGetDeviceInterfaceDetail(hdev, &did, 0, 0, &cbRequired, 0);
          if (ERROR_INSUFFICIENT_BUFFER == GetLastError())
          {
            PSP_DEVICE_INTERFACE_DETAIL_DATA pdidd =
              (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LPTR,
              cbRequired);
            if (pdidd)
            {
              pdidd->cbSize = sizeof(*pdidd);
              if (SetupDiGetDeviceInterfaceDetail(hdev, &did, pdidd, cbRequired, &cbRequired, 0))
              {
                OutputDebugString(pdidd->DevicePath);
                OutputDebugString(_T("\r\n"));

                if(uPID && uVID)
                {
                  LPTSTR pszVid = _tcsstr(pdidd->DevicePath, _T("vid_"));
                  LPTSTR pszPid = _tcsstr(pdidd->DevicePath, _T("pid_"));
                  if(pszVid && pszPid)
                  {
                    TCHAR szVID[5]={0}, szPID[5]={0};
                    _tcsncpy_s(szVID, pszVid+4, 4);
                    _tcsncpy_s(szPID, pszPid+4, 4);

                    UINT pid = (UINT)_tcstol(szPID, NULL, 16);
                    UINT vid = (UINT)_tcstol(szVID, NULL, 16);
                    if(pid == uPID && vid == uVID)
                    {
                      if(iFoundCount == iIndex)
                      {
                        if(szDevPath)
                        {
                          _tcscpy_s(szDevPath, MAX_PATH, pdidd->DevicePath);
                        }
                        bRet = TRUE;
                      }
                      iFoundCount++;
                    }
                  }
                }
              }
              LocalFree(pdidd);
            }
          }
        }
        else 
        {
          if (ERROR_NO_MORE_ITEMS == GetLastError())
          {
            break;  // Enumeration failed - perhaps there are no more items
          }
        }
      }
    }

    SetupDiDestroyDeviceInfoList(hdev);
  }
 
  return bRet;
}

int _tmain(int argc, _TCHAR* argv[])
{
  TCHAR szDevPath[MAX_PATH+1] = {0};
  if(EnumUSBDevice(0x403, 0x6001, TRUE, szDevPath))
  {
    MessageBox(NULL, szDevPath, _T("Usb Device"), MB_OK);
  }
	return 0;
}


 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
可以使用Windows的管理API来获取USB设备路径,具体方法如下: 1. 使用`SetupDiGetClassDevs`函数获取USB设备设备信息列表。 ``` HDEVINFO hDevInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_USB_DEVICE, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); ``` 2. 遍历设备信息列表,使用`SetupDiEnumDeviceInterfaces`函数获取每个设备接口的信息。 ``` SP_DEVICE_INTERFACE_DATA interfaceData; interfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); for (DWORD i = 0; SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &GUID_DEVINTERFACE_USB_DEVICE, i, &interfaceData); ++i) { // 获取设备接口的详细信息 SP_DEVICE_INTERFACE_DETAIL_DATA* pData = NULL; DWORD dwSize = 0; SetupDiGetDeviceInterfaceDetail(hDevInfo, &interfaceData, NULL, 0, &dwSize, NULL); pData = (SP_DEVICE_INTERFACE_DETAIL_DATA*)new BYTE[dwSize]; pData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); SetupDiGetDeviceInterfaceDetail(hDevInfo, &interfaceData, pData, dwSize, NULL, NULL); // 获取设备路径 TCHAR szDevicePath[MAX_PATH] = {0}; _tcscpy_s(szDevicePath, MAX_PATH, pData->DevicePath); // 处理设备路径 // ... delete[] pData; } ``` 3. 在遍历设备信息列表的过程中,可以通过设备接口的详细信息获取设备路径设备路径的格式为`\\?\USB#VID_xxxx&PID_xxxx#xxxxxxxxxxxxxxxx#{xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}`。其中,`VID_xxxx`表示设备的厂商ID,`PID_xxxx`表示设备的产品ID,`xxxxxxxxxxxxxxxx`是设备的序列号,`xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`是设备接口的GUID。 4. 处理设备路径,例如提取出VIDPID和序列号等信息,或者使用设备路径打开设备进行操作。 需要注意的是,上述代码只是一个简单的示例,实际使用时还需要进行错误处理和资源释放等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值