Ê×Ò³ | ÐÂÎÅ | ÐÂÆ· | ÎÄ¿â | ·½°¸ | ÊÓÆµ | ÏÂÔØ | ÉÌ³Ç | ¿ª·¢°å | Êý¾ÝÖÐÐÄ | ×ù̸аæ | Åàѵ | ¹¤¾ß | ²©¿Í | ÂÛ̳ | °Ù¿Æ | GEC | »î¶¯ | Ö÷ÌâÔ | µç×ÓÕ¹
·µ»ØÁÐ±í »Ø¸´ ·¢Ìû

USB HIDÉ豸¶Áд´úÂëʵÏÖc++£¨4£©

USB HIDÉ豸¶Áд´úÂëʵÏÖc++£¨4£©

bool MCDHid::findMCDHid()
{
    int vendorID = VENDOR_ID;
    int productID = PRODUCT_ID;
DWORD required;

    GUID hidGuid;
HDEVINFO hDevInfo;
SP_DEVICE_INTERFACE_DATA devInfoData;
int memberIndex = 0;
LONG result;
bool lastDevice = false;
DWORD length;
PSP_DEVICE_INTERFACE_DETAIL_DATA detailData = NULL;
    bool deviceDetected = false;


HidD_GetHidGuid(&hidGuid);
hDevInfo = SetupDiGetClassDevs
       (&hidGuid,
     NULL,
     NULL,
     DIGCF_PRESENT|DIGCF_INTERFACEDEVICE);
   //µ±Ó¦ÓóÌÐò²»ÔÙÐèҪʹÓÃSetupDiGetClassDevsº¯ÊýµÄ´«»ØÖµhDevInfoËùÖ¸µÄÊý×éʱ£¬Ó¦¸Ãµ÷ÓÃSetupDiDeStroyDeviceInfoListº¯ÊýÀ´ÊÍ·Å×ÊÔ´
   if(hDevInfo == INVALID_HANDLE_VALUE)
    {
     //printf("Failed to open device handle!");
     return false;
    }
   
   devInfoData.cbSize = sizeof(devInfoData);
   do
  {
   result = SetupDiEnumDeviceInterfaces(
       hDevInfo,
       0,
       &hidGuid,
       memberIndex,
       &devInfoData);      
   if (result != 0)
   {   
    result = SetupDiGetDeviceInterfaceDetail(
        hDevInfo,
        &devInfoData,
        NULL,
        0,
        &length,
        NULL);

    detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(length);
    if(!detailData)
              {
               //printf("Device information allacation failed!");
               return false;
              }
    detailData -> cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);           

    result = SetupDiGetDeviceInterfaceDetail(
        hDevInfo,
        &devInfoData,
        detailData,
        length,
        &required,
        NULL);
    if(!result)
              {
               //printf("Device information reallocation failed!");
               return false;
              }   
    _hidDevice.HidDevice = CreateFile(
         detailData->DevicePath,
         GENERIC_READ|GENERIC_WRITE,
         FILE_SHARE_READ|FILE_SHARE_WRITE,
         (LPSECURITY_ATTRIBUTES)NULL,
         OPEN_EXISTING,
         FILE_FLAG_OVERLAPPED,
         NULL);
            
    _hidDevice.Attributes.Size = sizeof(HIDD_ATTRIBUTES);
    result = HidD_GetAttributes(
        _hidDevice.HidDevice,
        &_hidDevice.Attributes);
    if ((_hidDevice.Attributes.VendorID == vendorID) && (_hidDevice.Attributes.ProductID == productID))
             {
               int status;
               PHIDP_PREPARSED_DATA PreparsedData ;
               deviceDetected = true;
               
               //»ñÈ¡USBÉ豸µÄÔ¤½âÎöÊý¾Ý
               result = HidD_GetPreparsedData(_hidDevice.HidDevice,&PreparsedData);
               if(!result)
               {
                //printf("ÎÞ·¨»ñÈ¡USBÉ豸µÄÔ¤½âÎöÊý¾Ý!");
                return false;
               }
               status= HidP_GetCaps(PreparsedData, &_hidDevice.Caps);
      _fUsbCommRunning = true;
      HidD_FreePreparsedData(PreparsedData);
      PreparsedData = NULL;
      
    }
    else
    {
     //printf("ûÓÐÕÒµ½É豸!");
     closeMCDHid();
    }
    free(detailData);
    detailData = NULL;
   }
   else
   {
            lastDevice = true;
   }
   memberIndex = memberIndex + 1;
  }while((lastDevice == false)&&(deviceDetected == false));
   
  SetupDiDestroyDeviceInfoList(hDevInfo);
  return deviceDetected;
}
¼Ì³ÐÊÂÒµ£¬Ð½»ðÏà´«