HID 程序设计

2024-01-05 09:58
文章标签 程序设计 hid

本文主要是介绍HID 程序设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 环境配置
1.1 安装NTDDK
1.2 设置VC++6.0的配置
工具 ->选择->目录
1.3 程序引用
#include <windows.h>
extern "C" {
#include <hidsdi.h>
#include <hidpi.h>
#include <setupapi.h>
}
#pragma comment(lib,"setupapi.lib")
#pragma comment(lib,"hid.lib")
不加 #include <windows.h>的后果:
c:/program files/microsoft visual studio/vc98/include/rpcndr.h(58) : fatal error C1189: #error : incorrect <rpcndr.h> version. Use the header that matches with the MIDL compiler.
不加 extern “C” {}的后果:
编译通过,构造出错, hid.obj : error LNK2001: unresolved external symbol "void __stdcall HidD_GetHidGuid(struct _GUID *)" (?HidD_GetHidGuid@@YGXPAU_GUID@@@Z)
Debug/hid.exe : fatal error LNK1120: 1 unresolved externals
不加 #pragma comment(lib,"hid.lib") 的后果:hid.obj : error LNK2001: unresolved external symbol _HidD_GetHidGuid@4
代码
/*名称:GetDevPath
功能:获取设备路径
参数:MemberIndex 设备列表的索引,txtpath文本缓存,以字符串保存设备路径
返回:-2表示结束,-1 表示不能获取GUID,0表示未找到设备,>0表示成功,且返回值为路径字符串长度
*/
int HidDevice::GetDevPath(DWORD MemberIndex,char *txtpath)
{
int    ret;
DWORD Length,Required;
//获GUID
HidD_GetHidGuid(&HidGuid);
hDevInfo=SetupDiGetClassDevs(&HidGuid,NULL,NULL,DIGCF_PRESENT|DIGCF_INTERFACEDEVICE);
if (hDevInfo == INVALID_HANDLE_VALUE)
{
return -1;
}
//枚举设备
ret=SetupDiEnumDeviceInterfaces(hDevInfo,0,&HidGuid,MemberIndex,&devInfoData);
if (!ret)
if(MemberIndex==1)
{
// MessageBox(NULL,"未找到任何可用USB设备!",NULL,NULL);
return 0;
}
else
return -2;
//获detaildata结构数组的长度
SetupDiGetDeviceInterfaceDetail(hDevInfo,&devInfoData,NULL,0,&Length,NULL);
detailData=(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(Length);
detailData->cbSize=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
//获detailData
ret=SetupDiGetDeviceInterfaceDetail(hDevInfo,&devInfoData,detailData,Length,&Required,NULL);
strcpy(txtpath,detailData->DevicePath);
return strlen(txtpath);
}
/*名称:GetProductInfo
功能:获取usb的hid设备的信息
参数:vendorid供应商,productid产品id,vernum版本号,manufaturer制造商,产品
返回:1
*/
int HidDevice::GetProductInfo(char *vendorid,char *productid,char *vernum,char *manufaturer,char *product)
{
HANDLE        hDeviceHandle;
HIDD_ATTRIBUTES Attributes;
WCHAR         mString[256];
hDeviceHandle = CreateFile(detailData->DevicePath ,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if(hDeviceHandle == INVALID_HANDLE_VALUE)
return 0;
HidD_GetAttributes(hDeviceHandle,&Attributes);
//将有关该设备的标识显示出来
sprintf(vendorid,"0x%04X",Attributes.VendorID);
sprintf(productid,"0x%04X",Attributes.ProductID);
sprintf(vernum,"0x%04X",Attributes.VersionNumber);
HidD_GetManufacturerString(hDeviceHandle,mString,sizeof(mString));
if (wcstombs(manufaturer,mString,256) == -1) // fail
manufaturer[0] = NULL;
HidD_GetProductString(hDeviceHandle,mString,sizeof(mString));
if (wcstombs(product,mString,256) == -1)
product[0] = NULL;
CloseHandle(hDeviceHandle);
return 1;
}

这篇关于HID 程序设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/572487

相关文章

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

MapReduce程序设计2

要求 1、数据集stock-daily,包含A股近4000只股票的今年以来的日数据;数据集stock-daily-30d仅包含最近30个交易日数据,根据自己计算机性能选择。 数据来源:https://www.joinquant.com/help/api/help?name=JQData 2、数据集stock-concept,包含A股近4000只股票所有的股票代码、名称和概念。 数据来源:万

java 程序设计 第九章对象和类

目录 9.1 引言 9.2 为对象定义类 9.3 示例:创建类和定义对象 9.4 使用构造方法构造对象 9.5 通过引用变量访问变量 9.6 使用Java中的类 9.7 静态变量、常量和方法 9.8 可见性修饰符  9.9 数据域封装 9.10 向方法传递对象参数 9.11 对象数组 9.12 不可变对象和类 9.13 变量的作用域 9.14 this引用 9.1

Windows程序设计课程作业-3(文件并发下载)

目录 目录 1.作业内容 2.作业要求 3.主要思路  1)窗体和组件初始化  2)下载管理器实例化 3)按钮点击事件处理 4)窗体加载事件处理  5)下载消息处理  4.主要难点 1)多线程管理: 2) UI更新: 3) 错误处理: 4) 资源管理: 5) 用户体验: 5.不足及改进 参考:  6.代码展示 代码仓库  7.运行结果 ​​​​​ 1.

C#实现音乐在线播放和下载——Windows程序设计作业3

1. 作业内容     编写一个C#程序,在作业二实现的本地播放功能的基础上,新增在线播放和在线下载功能,作业二博客地址:C#实现简单音乐文件解析播放——Windows程序设计作业2 2. 架构选择     考虑到需求中的界面友好和跨版本兼容性,我选择选择WinForms作为开发平台,WinForms提供了一个简单而强大的方法来创建桌面应用程序,并且与C#高度兼容,在开发过程,选择.NETF

java程序设计 第八章 多维数组

8.1 引言 二维数组可以将一维数组作为元素的数组 8.2  二维数组基础        声明二维数组:elementType[ ][ ] arrayRefVar                         例如:int[ ][ ] matrix; 创建二维数组:matrix = new int[5][5] 数组初始化简明语句: int[ ][ ] array = { {1

Java程序设计 第七章 一维数组

目录 7.2 数组基础 7.3 示例学习:分析数字 7.5复制数组 7.6 将数组传递给方法 7.7 方法返回数组 7.9 可变长参数列表 7.10 查找数组 7.11 数组排序(直接排序) 略 7.12 Arrays类 7.13 命令行参数 7.2 数组基础   声明数组:elementType[]  arrayRefVar;                 例

JavaSE 面向对象程序设计进阶 抽象类和接口 2024年详解

目录 抽象类 抽象方法 抽象类和抽象方法的注意事项 ​编辑 接口 如何定义接口 注意 代码实现 ​编辑 接口中的成员特点 接口和类之间的关系 1.类与类的关系 2.类与接口的关系 3.接口与接口的关系 ​编辑 拓展 接口中的默认方法 接口中的静态方法 ​编辑 接口中的私有方法 接口的应用 个人号推广 博客主页 Web后端开发 Web前端开发

北航数据结构与程序设计查找与排序编程题

查找与排序编程题 单词查找(查找——基本题)排座位(简)a 单词查找(查找——基本题) 【问题描述】 从标准输入中读入一个英文单词及查找方式,在一个给定的英文常用单词字典文件dictionary3000.txt中查找该单词,返回查找结果(查找到返回1,否则返回0)和查找过程中单词的比较次数。查找前,先将所有字典中单词读入至一个单词表(数组)中,然后按要求进行查找。字典中单词总数

python程序设计 函数基本知识点笔记整理

以下是Python函数的一些基本知识点: 1. 函数的定义和调用 定义函数 def function_name(parameters):"""Docstring"""statement(s) 示例 def greet(name):"""This function greets a person by name."""print(f"Hello, {name}!") 调用函数 gree