Setupapi 利用这个 我可以获得设备管理器中的 所有的硬件设备的描述!
但是我想更详细的获得设备的资料 像 设备的厂商id阿 这些在设备管理器中可以在设备的属性中看到  但是怎么在程序中抓到这些 信息??

解决方案 »

  1.   

    #include   <stdio.h>   
      #include   <windows.h>   
      #include   <setupapi.h>   
      #include   <devguid.h>   
        
      #pragma   comment(lib,   "setupapi")   
        
        
      int   main(int   argc,   char*   argv[])   
      {   
      //   得到设备信息集   
      HDEVINFO   hDevInfo   =   SetupDiGetClassDevs(   
      (LPGUID)&GUID_DEVCLASS_CDROM,     
      NULL,     
      0,     
      DIGCF_PRESENT/*   |   DIGCF_ALLCLASSES*/);   
        
      if     (hDevInfo     ==     INVALID_HANDLE_VALUE)       
      {   
      printf("Error!   SetupDiGetClassDevs()   return   %d\n",   GetLastError());   
      SetupDiDestroyDeviceInfoList(hDevInfo);   
      return     0;       
      }   
        
      TCHAR   szBuf[MAX_PATH];   
      SP_DEVINFO_DATA   spDevInfoData   =   {sizeof(SP_DEVINFO_DATA)};   
        
      //   开始列举设备   
      for   (DWORD   i   =   0;   SetupDiEnumDeviceInfo(hDevInfo,   i,   &spDevInfoData);   i++)   
      {   
      //   得到设备类描述   
      if   (   SetupDiGetClassDescription(   
      &spDevInfoData.ClassGuid,   
      szBuf,     
      MAX_PATH,     
      NULL)   )   
      {   
      printf("\n%03d   :   ClassDescription   =   %s\n",   i,   szBuf);   
      }   
        
      //   得到设备实例的唯一标识ID(由注册表路径组成)   
      if   (   SetupDiGetDeviceInstanceId(   
      hDevInfo,   
      &spDevInfoData,   
      szBuf,   
      MAX_PATH,   
      NULL)   )   
      {   
      printf("%03d   :   InstanceId   =   %s\n",   i,   szBuf);   
      }   
        
      //   得到设备名称   
      if   (   SetupDiGetDeviceRegistryProperty(   
      hDevInfo,   
      &spDevInfoData,   
      SPDRP_DEVICEDESC,   
      NULL,     
      (PBYTE)szBuf,   
      MAX_PATH,     
      NULL)   )   
      {   
      printf("%03d   :   DeviceDesc   =   %s\n",   i,   szBuf);   
      }   
        
      //   得到设备型号   
      if   (   SetupDiGetDeviceRegistryProperty(   
      hDevInfo,   
      &spDevInfoData,   
      SPDRP_FRIENDLYNAME,   
      NULL,     
      (PBYTE)szBuf,   
      MAX_PATH,     
      NULL)   )   
      {   
      printf("%03d   :   FriendName   =   %s\n",   i,   szBuf);   
      }   
        
      //   得到设备在注册表中的子路径   
      if   (   SetupDiGetDeviceRegistryProperty(   
      hDevInfo,   
      &spDevInfoData,   
      SPDRP_DRIVER,   
      NULL,     
      (PBYTE)szBuf,   
      MAX_PATH,     
      NULL)   )   
      {   
      printf("%03d   :   Regedit   Path   =   %s\n",   i,   szBuf);   
      }   
        
      }   
        
      printf("\nCdrom   count   =   %d\n",   i);   
      getchar();   
        
      return   0;   
      } 
    /*
    GUID_DEVCLASS_FDC软盘控制器    GUID_DEVCLASS_DISPLAY显示卡    GUID_DEVCLASS_CDROM光驱    GUID_DEVCLASS_KEYBOARD键盘    GUID_DEVCLASS_COMPUTER计算机    GUID_DEVCLASS_SYSTEM系统    GUID_DEVCLASS_DISKDRIVE磁盘驱动器    GUID_DEVCLASS_MEDIA声音、视频和游戏控制器    GUID_DEVCLASS_MODEMMODEM    GUID_DEVCLASS_MOUSE鼠标和其他指针设备    GUID_DEVCLASS_NET网络设备器    GUID_DEVCLASS_USB通用串行总线控制器    GUID_DEVCLASS_FLOPPYDISK软盘驱动器    GUID_DEVCLASS_UNKNOWN未知设备    GUID_DEVCLASS_SCSIADAPTERSCSI 和 RAID 控制器    GUID_DEVCLASS_HDCIDE ATA/ATAPI 控制器    GUID_DEVCLASS_PORTS端口(COM 和 LPT)    GUID_DEVCLASS_MONITOR监视器
    */自己搞定了