1. 程式人生 > >獲取指定USB裝置的VID PID和SerialNumber

獲取指定USB裝置的VID PID和SerialNumber

裝置廠商ID 查詢, google www.usb.org + vendor id list   

所需標頭檔案庫檔案: #include <Setupapi.h> , Setupapi.lib

void CCameraInfoViewerDlg::CollectUSBInfo()
{
    // 獲取當前系統所有使用的裝置
    DWORD dwFlag = (DIGCF_ALLCLASSES | DIGCF_PRESENT);
    HDEVINFO hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL, dwFlag);
    if( INVALID_HANDLE_VALUE == hDevInfo )
    {
  AfxMessageBox( _T("獲取系統裝置列表失敗") );
        return;
    }

 // 準備遍歷所有裝置查詢USB
    SP_DEVINFO_DATA sDevInfoData;
    sDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);


 //VID: ZYZW  公司的生產商號
 const TCHAR NIKON_ID[] = _T("XYZW");

 CString strText;
 TCHAR szDIS[MAX_PATH]; // Device Identification Strings, 
 DWORD nSize = 0 ;
    for(int i = 0; SetupDiEnumDeviceInfo(hDevInfo,i,&sDevInfoData); i++ )
    {
        nSize = 0;
        if ( !SetupDiGetDeviceInstanceId(hDevInfo, &sDevInfoData, szDIS, sizeof(szDIS), &nSize) )
        {
   AfxMessageBox( _T("獲取裝置識別字符串失敗") );
            break;
        }

  // 裝置識別串的前三個字元是否是"USB", 模板: USB\VID_XXXX&PID_XXXX\00000xxxxxxx
  CString strDIS( szDIS );
  strDIS.MakeUpper();
  if( strDIS.Left( 3 ) == _T("USB") )
  {
   strText += strDIS;
   strText += _T("\r\n");


   int iVID_Pos = strDIS.Find( NIKON_ID );
   if( iVID_Pos == 8 )
   {
    // VID: 廠商號
    m_wndEditVID.SetWindowText( NIKON_ID  );

    // PID :產品號
    int iSlashPos = strDIS.ReverseFind(_T('\\'));
    int iPID_Pos = strDIS.Find( _T("PID_") );
    CString strProductID = strDIS.Mid( iPID_Pos+4, iSlashPos - iPID_Pos - 4 );
    m_wndEditPID.SetWindowText( strProductID  );

    // 序列號
    int iRight = strDIS.GetLength() - iSlashPos  -1;
    CString strSerialNumber = strDIS.Right( iRight );
    m_wndEditNUM.SetWindowText( strSerialNumber );
   }
        }
    }

 m_wndEditENUM.SetWindowText( strText );

 // 釋放裝置
    SetupDiDestroyDeviceInfoList(hDevInfo);
}