MFC 枚举USB设备

2019-07-14 01:19发布

#include #define WIN32_LEAN_AND_MEAN
#include #include
#include
#pragma comment(lib, "setupapi.lib") #include
#define MAX_DEVICE 16
#include
#include
#include
int nCount=0;
// SetupDiGetInterfaceDeviceDetail所需要的输出长度,定义足够大
#define INTERFACE_DETAIL_SIZE 1024
const GUID DiskClassGuid ={0x873fdf, 0x61a8, 0x11d1, 0xaa, 0x5e, 0x0, 0xc0, 0x4f, 0xb1, 0x72, 0x8b};  //设备GUID // 根据GUID获得设备路径
// lpGuid: GUID指针
// pszDevicePath: 设备路径指针的指针
// 返回: 成功得到的设备路径个数,可能不止1个
int GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath)
{
    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)
    {
        return 0;
    }
 
    // 申请设备接口数据空间
    pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, INTERFACE_DETAIL_SIZE);
 
    pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
    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)
            {
                // 复制设备路径到输出缓冲区
                ::strcpy(pszDevicePath[nCount], pDetail->DevicePath);
   
                // 调整计数值
                nCount++;
            }
        }
    }
 
    // 释放设备接口数据空间
    ::GlobalFree(pDetail);
 
    // 关闭设备信息集句柄
    ::SetupDiDestroyDeviceInfoList(hDevInfoSet);
 
    return nCount;
} HANDLE OpenDevice(char *devName)  //逐个打开设备
{
 HANDLE hOut;
 hOut=CreateFile(devName,
 GENERIC_READ|GENERIC_WRITE,
 FILE_SHARE_READ|FILE_SHARE_WRITE,
 NULL,
 OPEN_EXISTING,
 0,
 NULL);
 if(hOut==INVALID_HANDLE_VALUE)
 {
   printf("failed to open %s/n",devName);
 
 }
    return hOut; }  
//pszDevicePath是个指向字符串指针的指针
HANDLE * Open_file()
{
    int i;
    char* szDevicePath[MAX_DEVICE];        // 设备路径
 int nDevice=0;
 HANDLE hDevice[MAX_DEVICE];
 HANDLE * h=new HANDLE[MAX_DEVICE];
 
    // 分配需要的空间
    for (i = 0; i < MAX_DEVICE; i++)
    {
        szDevicePath[i] = new char[256];
    }
 
    // 取设备路径
    nDevice = ::GetDevicePath((LPGUID)&DiskClassGuid, szDevicePath);
 printf("%d",nDevice);
 
    // 逐一获取设备信息
    for (i = 0; i < nDevice; i++)
    {
     
      h[i]=CreateFile(szDevicePath[i],
  GENERIC_WRITE | GENERIC_READ,
  //FILE_SHARE_WRITE | FILE_SHARE_READ,
  0,
  NULL,
  OPEN_EXISTING,
  0,
  NULL);
   if (h[i]== INVALID_HANDLE_VALUE) {
  printf("Failed to open (%s)", szDevicePath[i]);
   } else
   {
  printf("Opened successfully./n");
 }           return h;  //返回实例句柄集合
 }
 
        /*if (hDevice != INVALID_HANDLE_VALUE)
        {
            ... ...        // I/O操作
 
            ::CloseHandle(hDevice);
        }*/     // 释放空间
   /* for (i = 0; i & i    {
        delete []szDevicePath[i];
    }
 */
}
/*
//Q 得到设备路径后,就可以到下一步,用CreateFile打开设备,然后用DeviceIoControl  int MAX_DEVICE = 2;
 int i;
    char* szDevicePath[8];        // 设备路径
 
    // 分配需要的空间
    for (i = 0; i < MAX_DEVICE; i++)
    {
        szDevicePath[i] = new char[256];
        ZeroMemory(szDevicePath[i],256);   //szDevicePath[i]置为0
    }
 
    // 取设备路径
    int nDevice = ::GetDevicePath((LPGUID)&DiskClassGuid, szDevicePath);  for (i = 0; i < MAX_DEVICE; i++)
    {
        MessageBox(szDevicePath[i]);
    }
 for (i = 0; i < MAX_DEVICE; i++)
    {
        delete []szDevicePath[i];
    } */ int main()
{
 HANDLE *P=Open_file();
return 0; }