枚举匹配VID PID的 HID设备,并返回设备路径
来源:互联网 发布:tv版软件 编辑:程序博客网 时间:2024/05/22 20:30
#include <dbt.h>#include <wtypes.h>#include <sal_supp.h>#include <kernelspecs.h>#include <setupapi.h>extern "C"{#include <hidsdi.h>}#pragma comment(lib,"hid.lib")#pragma comment(lib,"setupapi.lib")BOOL EnumHIDDevice(WORD uVID, WORD uPID, //USB VID PID BOOL bPresentFlag, //设备必须存在标志 0不需要插入设备 TCHAR szDevPath[MAX_PATH+1] = NULL, //设备路径 int iIndex=0) //第N个设备 (对多个相同的设备进行区分){ BOOL bRet = FALSE; int iFoundCount = 0; //查找到匹配设备个数 GUID HidGuid; HidD_GetHidGuid(&HidGuid); DWORD dwFlage = DIGCF_DEVICEINTERFACE; if(bPresentFlag) dwFlage |= DIGCF_PRESENT; HDEVINFO hdev = SetupDiGetClassDevs(&HidGuid, NULL, NULL, dwFlage); if (INVALID_HANDLE_VALUE != hdev) { int idev = 0; while(! bRet) { SP_DEVICE_INTERFACE_DATA did = {0}; did.cbSize = sizeof(did); if (SetupDiEnumDeviceInterfaces(hdev, 0, &HidGuid, idev, &did)) { DWORD cbRequired = 0; SetupDiGetDeviceInterfaceDetail(hdev, &did, 0, 0, &cbRequired, 0); if (ERROR_INSUFFICIENT_BUFFER == GetLastError()) { PSP_DEVICE_INTERFACE_DETAIL_DATA pdidd = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LPTR, cbRequired); if (pdidd) { pdidd->cbSize = sizeof(*pdidd); if (SetupDiGetDeviceInterfaceDetail(hdev, &did, pdidd, cbRequired, &cbRequired, 0)) { TRACE(_T("\n%s\n"), pdidd->DevicePath); // Enumerated a battery. Ask it for information. HANDLE hDevHandle = CreateFile(pdidd->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE != hDevHandle) { // Ask the battery for its tag. HIDD_ATTRIBUTES hidAttributes = {0}; hidAttributes.Size = sizeof(hidAttributes); if (HidD_GetAttributes(hDevHandle, &hidAttributes)) { if( hidAttributes.VendorID == uVID && hidAttributes.ProductID == uPID) { WCHAR szManufacturer[MAX_PATH+1]={0}; WCHAR szProduct[MAX_PATH+1]={0}; WCHAR szSerialNumber[MAX_PATH+1]={0}; HidD_GetManufacturerString(hDevHandle, szManufacturer, MAX_PATH); HidD_GetProductString(hDevHandle, szProduct, MAX_PATH); HidD_GetSerialNumberString(hDevHandle, szSerialNumber, MAX_PATH); TRACE(_T("Manufacturer string=%s\n"), (LPCTSTR)CString(szManufacturer)); TRACE(_T("Product string=%s\n"), (LPCTSTR)CString(szProduct)); TRACE(_T("SerialNumber=%s\n"), (LPCTSTR)CString(szSerialNumber)); if(iFoundCount == iIndex) { if(szDevPath) { _tcscpy_s(szDevPath, MAX_PATH, pdidd->DevicePath); } bRet = TRUE; } iFoundCount++; } } CloseHandle(hDevHandle); } else { DWORD dwErr = GetLastError(); TRACE(_T("CreateFile failed with code %lu\n"), dwErr); } } else { DWORD dwErr = GetLastError(); TRACE(_T("SetupDiGetDeviceInterfaceDetail failed with code %lu\n"), dwErr); } LocalFree(pdidd); } } } else if (ERROR_NO_MORE_ITEMS == GetLastError()) { break; // Enumeration failed - perhaps there are no more items } idev++; //for next device } SetupDiDestroyDeviceInfoList(hdev); } return bRet;}
//测试代码 TCHAR szDevPath[MAX_PATH+1] = {0}; if(EnumHIDDevice(0x046d, 0xC018, TRUE, szDevPath)) { ::MessageBox(NULL, szDevPath, _T("Hid Device"), MB_OK); }
- 枚举匹配VID PID的 HID设备,并返回设备路径
- 根据VID PID获取USB设备路径
- 添加VID/PID到标准hid设备-OK
- linux 停 HID 设备 节点文件 访问 查找 VID PID
- 添加VID/PID到标准hid设备-OK
- 浅谈USB设备的VID和PID
- 浅谈USB设备的VID和PID
- 浅谈USB设备的VID和PID
- USB设备的VID和PID
- USB设备的VID与PID
- 获取usb设备的vid,pid
- USB设备的VID和PID
- USB设备的VID和PID
- 获取输入设备的vid和pid
- USB设备的VID与PID
- USB设备的VID与PID
- USB设备的VID与PID
- USB设备的VID与PID
- XmlReader类
- CLisp 2:设置自己的工作环境
- POJ 1363 Rails
- 注册ODBC数据库
- cvRound cvFloor cvCei 和 int
- 枚举匹配VID PID的 HID设备,并返回设备路径
- POJ 3013 SPFA
- 重装系统
- ArcGIS Engine要素渲染和专题图制作
- WP7开发模式
- 2012 百度实习生面试题
- 数据库基本结构
- 【PB】PB编程通俗快速入手
- 重写Jquery的$.ajax方法