相同HID设备的句柄获取
来源:互联网 发布:nginx request body 编辑:程序博客网 时间:2024/06/11 01:06
最近项目上需要做一个小上位机,获取相同HID设备的信息,并逐个进行系统设置。
经过1天的调试,已经完成了。前期在相同HID设备句柄获取方面,受到了一点小小的阻力,网上也没有获取到相关的信息,可能有遇到同样问题的朋友,把我的解决方式贴出来,或许会有点作用吧。
基于VS2015,使用MFC自带USB类库。核心代码如下,思路其实很简单:通常我们使用PID和VID来获得不同设备的句柄,相同PID和VID的设备,就需要其他的特征来获取句柄,调试过程中发现,相同HID的设备,设备路径是不同的,可以用设备路径作为区分,来获得句柄即可。
HANDLE OpenSamePIDDevice(int overlapped, unsigned short Pid_Value){int Pid_count = 0;LPCWSTR device_path = NULL;HANDLE hidHandle = NULL;HidD_GetHidGuid(&hidGuid); //取得类别 HDEVINFO hDevInfo = SetupDiGetClassDevs(&hidGuid, NULL, NULL,(DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)); //获取设备信息群if (hDevInfo == INVALID_HANDLE_VALUE)//未获得设备信息群则直接退出return INVALID_HANDLE_VALUE;SP_DEVICE_INTERFACE_DATA devInfoData;devInfoData.cbSize = sizeof(SP_DEVICE_INTERFACE_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))//获得详细信息失败则退出{free(devDetail);SetupDiDestroyDeviceInfoList(hDevInfo);return INVALID_HANDLE_VALUE;}if (overlapped) //打开设备{hidHandle = CreateFile(devDetail->DevicePath,GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);}else{hidHandle = CreateFile(devDetail->DevicePath,GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING, 0, NULL);}//if (devDetail != NULL)//free(devDetail);if (hidHandle == INVALID_HANDLE_VALUE){SetupDiDestroyDeviceInfoList(hDevInfo);//free(devDetail);return INVALID_HANDLE_VALUE;}_HIDD_ATTRIBUTES hidAttributes;if (!HidD_GetAttributes(hidHandle, &hidAttributes)){CloseHandle(hidHandle);SetupDiDestroyDeviceInfoList(hDevInfo);return INVALID_HANDLE_VALUE;}if ((USB_VID == hidAttributes.VendorID)&(Pid_Value == hidAttributes.ProductID)) //仅仅根据VID进行STM32设备判断{++Pid_count;if (Pid_count == 1){ //获得句柄if(Pid_Value == Falcon_Handset_PID){ hHandSet1 = hidHandle;}else if(Pid_Value == Falcon_Camera_PID){hCamera1 = hidHandle;}device_path = devDetail->DevicePath;//用于路径比较}if ((Pid_count != 1)&(device_path!= devDetail->DevicePath)){ if (Pid_Value == Falcon_Handset_PID){hHandSet2 = hidHandle;}else if (Pid_Value == Falcon_Camera_PID){hCamera2 = hidHandle;} break;}//CloseHandle(hidHandle);++deviceNo;}else{CloseHandle(hidHandle);++deviceNo;}}}SetupDiDestroyDeviceInfoList(hDevInfo);return hidHandle;}
0 0
- 相同HID设备的句柄获取
- 获取设备的句柄
- HID设备的开发
- HID 设备的开发
- 获取设备句柄的两种方法
- 获取设备环境句柄的方法
- 获取设备环境句柄的方法
- 通过WMI获取设备名,HID设备获取设备描述符的一个折中办法
- 获取设备上下文句柄
- 获取设备环境句柄
- 自定义 HID 设备的实现
- Android HID设备的连接
- 获取设备描述表句柄
- TextOut函数及设备描述表句柄的获取
- USB HID类设备开发中用CreateFile无法得到设备句柄
- USB HID类设备开发中用CreateFile无法得到设备句柄,读访问失败
- Android UsbManager 获取不到HID设备(实际上就是Input设备)怎样通信的问题(已解决)!
- HID 设备PC端软件的开发
- yii2框架-yii2局部关闭(开启)csrf的验证(十七)
- 使用comm在java程序中管理本地端口
- java 内部类(inner class)详解
- 解决在部分手机webview字体显示过小的问题
- java文件读取web-inf下的spring的xml配置文件
- 相同HID设备的句柄获取
- 【算法设计与分析】墓地雕塑
- c#对两个txt文件的列合并
- 百度 进程调度算法
- 【杭电-oj】-1873-看病要排队(优先队列)
- PAT—1003. Emergency
- js、Jquery、AngularJs中的extend方法
- Tomcat类加载机制概述
- Git简单使用教程(五)-添加远程库