VC 获取USB设备的ID号

时间:2021-12-14 16:09:36
1.添加对象/库模块“setupapi.lib ”

    2.包含头文件“winioctl.h”

    3.包含头文件“initguid.h”

    4.包含头文件“setupapi.h"

    5.添加宏定义"DEFINE_GUID(UsbClassGuid, 0xa5dcbf10L, 0x6530, 0x11d2, 0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xed);";

    6.添加宏定义“#define INTERFACE_DETAIL_SIZE (1024)”;

    7.添加代码:

CString CMyDlg::GetDevicePath(LPGUID lpGuid)
{
 int nCount;
 CString Sdn;
 HDEVINFO hDevInfoSet;
 SP_DEVICE_INTERFACE_DATA ifdata;
 PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail;
 BOOL bResult; // 取得一个该GUID相关的设备信息集句柄
 hDevInfoSet = ::SetupDiGetClassDevs(lpGuid, // class GUID
  NULL, // 无关键字
  NULL, // 不指定父窗口句柄
  DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); // 目前存在的设备 // 失败...
 if (hDevInfoSet == INVALID_HANDLE_VALUE)
 {
  AfxMessageBox("获取相关的设备信息集GUID句柄失败!");
 } // 申请设备接口数据空间
 else
 {
  pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, INTERFACE_DETAIL_SIZE);
  pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
  nCount = 0;
  bResult = TRUE; // 设备序号=0,1,2... 逐一测试设备接口,到失败为止
  while (bResult)
  {
   ifdata.cbSize = sizeof(ifdata); // 枚举符合该GUID的设备接口
   bResult = ::SetupDiEnumDeviceInterfaces( hDevInfoSet, // 设备信息集句柄
    NULL, // 不需额外的设备描述
    lpGuid, // GUID
    (ULONG)nCount, // 设备信息集里的设备序号
    &ifdata); // 设备接口信息
   if (bResult)
   {
    // 取得该设备接口的细节(设备路径)
    bResult = SetupDiGetInterfaceDeviceDetail( hDevInfoSet, // 设备信息集句柄
     &ifdata, // 设备接口信息
     pDetail, // 设备接口细节(设备路径)
     INTERFACE_DETAIL_SIZE, // 输出缓冲区大小
     NULL, // 不需计算输出缓冲区大小(直接用设定值)
     NULL); // 不需额外的设备描述
    if (bResult)
    {
     // 复制设备路径到输出缓冲区
     Sdn=pDetail->DevicePath; 
     // 调整计数值
     nCount++;

     AfxMessageBox(Sdn);//用于调试用
    }
   }
  }
  // 释放设备接口数据空间
  ::GlobalFree(pDetail); // 关闭设备信息集句柄
  ::SetupDiDestroyDeviceInfoList(hDevInfoSet);
 }
 return Sdn;//包含设备ID的字符串
}

函数调用如下:

GetDevicePath((LPGUID)&UsbClassGuid);