根據VID PID擷取USB裝置路徑

來源:互聯網
上載者:User

 

 

#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;}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.