getUSB设备的属性

我想在我的应用程序里获得一个USB设备的属性(下面是原码),在执行SetupDiEnumDeviceInterfaces()时出错:No   more   data   is   available。  
   
  请看一看一段代码:  
  const   GUID   hidGuid=   {0x4D36E96D,   0xE325,   0x11CE,   {0xBF,   0xC1,   0x08,   0x00,   0x2B,   0xE1,   0x03,   0x18}};  
   
  HDEVINFO   hDevInfo   =   SetupDiGetClassDevs(&hidGuid,  
  NULL,   //   no   enumerator    
  NULL,   //   no   parent  
  (DIGCF_PRESENT   |   DIGCF_INTERFACEDEVICE));    
  if(!hDevInfo)  
  {  
  m_st.SetWindowText("Couldn't   get   handle   for   HID   devices");  
  return;  
  }  
   
  SP_INTERFACE_DEVICE_DATA   devInfoData;  
  devInfoData.cbSize   =   sizeof   (SP_INTERFACE_DEVICE_DATA);  
  int   deviceNo   =   0;  
   
  SetLastError(NO_ERROR);  
   
  while(GetLastError()   !=   ERROR_NO_MORE_ITEMS)  
  {  
  if(SetupDiEnumInterfaceDevice   (hDevInfo,  
  0,    
  &hidGuid,  
  deviceNo,  
  &devInfoData))  
  {  
  ULONG   requiredLength   =   0;  
  SetupDiGetInterfaceDeviceDetail(hDevInfo,  
  &devInfoData,  
  NULL,  
  0,  
  &requiredLength,  
  NULL);  
   
  PSP_INTERFACE_DEVICE_DETAIL_DATA   devDetail   =   (SP_INTERFACE_DEVICE_DETAIL_DATA*)   malloc   (requiredLength);  
  devDetail->cbSize   =   sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);  
   
  if(!   SetupDiGetInterfaceDeviceDetail(hDevInfo,  
  &devInfoData,  
  devDetail,  
  requiredLength,  
  NULL,  
  NULL))    
  {  
  AfxMessageBox("Couldn't   get   HID   details");  
  free(devDetail);  
  return;  
  }  
   
  //   open   a   file   to   this   device  
  HANDLE   hidHandle   =   CreateFile(devDetail->DevicePath,  
  GENERIC_READ   |   GENERIC_WRITE,  
  FILE_SHARE_READ   |   FILE_SHARE_WRITE,  
  NULL,    
  OPEN_EXISTING,  
  FILE_FLAG_OVERLAPPED,    
  NULL);  
  free(devDetail);  
   
  if(INVALID_HANDLE_VALUE   ==   hidHandle)  
  {  
  AfxMessageBox("Couldn't   get   HID   handle");  
  return;  
  }  
 
问题点数:50、回复次数:5
Top
 

1 楼taianmonkey()回复于 2004-08-02 21:27:12 得分 50#include   "Setupapi.h"  
  #include   "afxwin.h"  
  #pragma   comment(lib,"Setupapi.lib")  
  GUID   hidGuid=   {0x4D36E96D,   0xE325,   0x11CE,   {0xBF,   0xC1,   0x08,   0x00,   0x2B,   0xE1,   0x03,   0x18}};  
   
   
   
  ........  
   
  HDEVINFO   hDevInfo   =   SetupDiGetClassDevs(&hidGuid,  
  NULL,   //   no   enumerator    
  NULL,   //   no   parent  
  (DIGCF_PRESENT   |   DIGCF_INTERFACEDEVICE));    
  if(!hDevInfo)  
  {  
  AfxMessageBox(_T("Couldn't   get   handle   for   HID   devices"));  
  return;  
  }  
   
  SP_INTERFACE_DEVICE_DATA   devInfoData;  
  devInfoData.cbSize   =   sizeof   (SP_INTERFACE_DEVICE_DATA);  
  int   deviceNo   =   0;  
   
  SetLastError(NO_ERROR);  
   
  while(GetLastError()   !=   ERROR_NO_MORE_ITEMS)  
  {  
  if(SetupDiEnumInterfaceDevice   (hDevInfo,  
  0,    
  &hidGuid,  
  deviceNo,  
  &devInfoData))  
  {  
  ULONG   requiredLength   =   0;  
  SetupDiGetInterfaceDeviceDetail(hDevInfo,  
  &devInfoData,  
  NULL,  
  0,  
  &requiredLength,  
  NULL);  
   
  PSP_INTERFACE_DEVICE_DETAIL_DATA   devDetail   =   (SP_INTERFACE_DEVICE_DETAIL_DATA*)   malloc   (requiredLength);  
  devDetail->cbSize   =   sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);  
   
  if(!   SetupDiGetInterfaceDeviceDetail(hDevInfo,  
  &devInfoData,  
  devDetail,  
  requiredLength,  
  NULL,  
  NULL))    
  {  
  AfxMessageBox("Couldn't   get   HID   details");  
  free(devDetail);  
  return;  
  }  
   
  //   open   a   file   to   this   device  
  HANDLE   hidHandle   =   CreateFile(devDetail->DevicePath,  
  GENERIC_READ   |   GENERIC_WRITE,  
  FILE_SHARE_READ   |   FILE_SHARE_WRITE,  
  NULL,    
  OPEN_EXISTING,  
  FILE_FLAG_OVERLAPPED,    
  NULL);  
  free(devDetail);  
   
  if(INVALID_HANDLE_VALUE   ==   hidHandle)  
  {  
  AfxMessageBox("Couldn't   get   HID   handle");  
  return;  
  }  
  }  
  }
Top

2 楼zhangnanonnet(鱼欢)回复于 2004-08-02 21:42:31 得分 0 #include   <objbase.h>  
  #include   <setupapi.h>  
  #include   <initguid.h>  
   
  #define     USB_GUID_STR   "{B5157D69-75F8-11d3-8CE0-00207815E456}"   //define   the   GUID   for   your   device   class  
  DEFINE_GUID(USB_GUID,   0xb5157d69,   0x75f8,   0x11d3,   0x8c,   0xe0,   0x0,   0x20,   0x78,   0x15,   0xe4,   0x56);  
   
  #define   MAX_INSTANCE   10  
  char   name[MAX_INSTANCE][MAX_PATH];//the   device   path   is   returned,   which   can   be   used   to   open   the   device   as   the   file   name.  
  int Scan(void) //return   the   number   of   the   device   attached.   Zero,   if   the   device   is   not   attached.  
  {  
   
  //   Get   handle   to   the   devices   manager  
  HDEVINFO     hInfo   =   SetupDiGetClassDevs((LPGUID)&USB_GUID,   NULL,   NULL,  
                                                                            DIGCF_PRESENT   |     DIGCF_INTERFACEDEVICE);  
   
          if   (hInfo   ==   INVALID_HANDLE_VALUE) //   check   for   error  
  return(0);  
   
   
  for   (DWORD   i=0;   ;   ++i) //   loop   till   all   devices   are   found  
  {  
  SP_INTERFACE_DEVICE_DATA   Interface_Info; //   declare   structure  
  Interface_Info.cbSize   =   sizeof(Interface_Info); //   Enumerate   device  
  if   (!SetupDiEnumInterfaceDevice(hInfo,   NULL,   (LPGUID)   &USB_GUID,i,   &Interface_Info))  
  {  
  SetupDiDestroyDeviceInfoList(hInfo);  
  return(i);  
  }  
   
  DWORD   needed; //   get   the   required   lenght  
  SetupDiGetInterfaceDeviceDetail(hInfo,   &Interface_Info,   NULL,   0,   &needed,   NULL);  
  PSP_INTERFACE_DEVICE_DETAIL_DATA   detail   =   (PSP_INTERFACE_DEVICE_DETAIL_DATA)   malloc(needed);  
  if   (!detail)  
  {      
  SetupDiDestroyDeviceInfoList(hInfo);  
  return(i);  
  }  
  //   fill   the   device   details  
  detail->cbSize   =   sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);  
  if   (!SetupDiGetInterfaceDeviceDetail(hInfo,   &Interface_Info,   detail,   needed,NULL,   NULL))  
  {  
  free((PVOID)   detail);  
  SetupDiDestroyDeviceInfoList(hInfo);  
  return(i);  
  }  
   
  strncpy(name[i],   detail->DevicePath,   MAX_PATH); //   copy   the   device   name  
  free((PVOID)   detail); //   free   the   mem  
  }      
  }  
 
Top

3 楼codewarrior(会思考的草)回复于 2004-08-03 07:50:20 得分 0 DEFINE_GUID (GUID_CLASS_USB_DEVICE,   0xA5DCBF10L,   0x6530,   0x11D2,   0x90,   0x1F,   0x00,   0xC0,   0x4F,   0xB9,   0x51,   0xED);  
   
   
  BOOL   CDeviceList::Initialize()  
  {  
  HDEVINFO   hDevInfoSet   =   SetupDiGetClassDevs(&m_Guid,   NULL,   NULL,   DIGCF_PRESENT   |   DIGCF_INTERFACEDEVICE);  
  if(hDevInfoSet   ==   INVALID_HANDLE_VALUE)  
  {  
  return   FALSE;  
  }  
   
  SP_DEVICE_INTERFACE_DATA   DevIfData   =   {0};  
  DevIfData.cbSize   =   sizeof(DevIfData);  
  for(DWORD   dwDevIndex=0;   SetupDiEnumDeviceInterfaces(hDevInfoSet,   NULL,   &m_Guid,   dwDevIndex,   &DevIfData);   ++dwDevIndex)  
  {  
  DWORD   dwNeededSz   =   0;  
  SetupDiGetDeviceInterfaceDetail(hDevInfoSet,   &DevIfData,   NULL,   0,   &dwNeededSz,   NULL);  
   
  PSP_INTERFACE_DEVICE_DETAIL_DATA   pDevIfDetail   =   (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(dwNeededSz);  
  pDevIfDetail->cbSize   =   sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);  
  SP_DEVINFO_DATA   DevInfo   =   {0};  
  DevInfo.cbSize   =   sizeof(SP_DEVINFO_DATA);  
  if(!SetupDiGetDeviceInterfaceDetail(hDevInfoSet,   &DevIfData,   pDevIfDetail,   dwNeededSz,   NULL,   &DevInfo))  
  {  
  free((PVOID)   pDevIfDetail);  
  continue;  
  }  
   
  TCHAR   fname[256]   =   {0};  
  if(!SetupDiGetDeviceRegistryProperty(hDevInfoSet,   &DevInfo,   SPDRP_FRIENDLYNAME,   NULL,   (PBYTE)   fname,   sizeof(fname),   NULL)   &&    
        !SetupDiGetDeviceRegistryProperty(hDevInfoSet,   &DevInfo,   SPDRP_DEVICEDESC,   NULL,   (PBYTE)   fname,   sizeof(fname),   NULL))  
  {  
  _tcsncpy(fname,   pDevIfDetail->DevicePath,   256);  
  }  
   
  m_DevList.push_back(CDeviceListEntry(pDevIfDetail->DevicePath,   fname));  
  free((PVOID)pDevIfDetail);  
  }  
   
  SetupDiDestroyDeviceInfoList(hDevInfoSet);  
   
  return   TRUE;  
  }  
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值