(USB HID) VC++ 使用 SetupAPI 操作 USB HID Device
在VC裡頭使用 Api必須include 跟加入 lib,加入之後就可以在VC裡頭任意使用api了
暫時先貼上程式碼...等待有空時候在更新說明
extern "C"
{
#include <hidsdi.h>
#include <SetupAPI.h>
}

Dialog head file
// CUsbHidDlg dialog
class CUsbHidDlg : public CDialogEx
{
// Construction
public:
CUsbHidDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data
enum { IDD = IDD_USBHID_DIALOG }; protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
public:
GUID HidGuid;
HDEVINFO DevInfo;
HIDD_ATTRIBUTES DevAttributes;
SP_DEVICE_INTERFACE_DATA DevData;
PSP_DEVICE_INTERFACE_DETAIL_DATA DevDetail;
PHIDP_PREPARSED_DATA PreparsedData;
HIDP_CAPS Capabilities;
ULONG Length;
int Index;
BOOL ok;
HANDLE DevHandle;
HANDLE RdHandle;
int DevCount = ; CEdit m_VID;
CEdit m_PID;
CEdit m_OutID;
CEdit m_InID; // Implementation
protected:
HICON m_hIcon; // Generated message map functions
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedOk(); public:
BOOL FindHID();
BOOL DeviceWriteFile();
BOOL DeviceReadFile();
BOOL OutReport();
BOOL InReport();
afx_msg void OnBnClickedWritefile();
afx_msg void OnBnClickedReadfile();
afx_msg void OnBnClickedGetreport();
afx_msg void OnBnClickedSetreport();
};
FindHid
uint16_t UVID;
uint16_t UPID; BOOL bSuccess;
CString buf;
int index = -;
CloseHandle(DevHandle);
DevHandle = INVALID_HANDLE_VALUE;
HidD_GetHidGuid(&HidGuid); wchar_t * wbuf = NULL;
byte ReportID;
GetDlgItemTextW(IDC_VID, buf);
UVID = wcstol(buf, &wbuf, );
GetDlgItemTextW(IDC_PID, buf);
UPID = wcstol(buf, &wbuf, ); buf.Format(_T("%08x-%04x-%04x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x\r\n"),
HidGuid.Data1, HidGuid.Data2, HidGuid.Data3,
HidGuid.Data4[],
HidGuid.Data4[],
HidGuid.Data4[],
HidGuid.Data4[],
HidGuid.Data4[],
HidGuid.Data4[],
HidGuid.Data4[],
HidGuid.Data4[]);
SetDlgItemText(IDC_INFO, buf.MakeUpper());
ULONG predictedLength = ;
ULONG requiredLength = ; DevInfo = SetupDiGetClassDevs(&HidGuid, NULL, NULL, (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE));
DevDetail = NULL;
DevData.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA); for (int i = ; i < ; i++)
{
bSuccess = SetupDiEnumDeviceInterfaces(DevInfo, , &HidGuid, i, &DevData); if (!bSuccess) continue;
bSuccess = SetupDiGetDeviceInterfaceDetail(DevInfo, &DevData, NULL, , &predictedLength, NULL);
DevDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(predictedLength);
DevDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
bSuccess = SetupDiGetDeviceInterfaceDetail(DevInfo, &DevData, DevDetail, predictedLength, &requiredLength, NULL);
if (!bSuccess)
{
free(DevDetail);
DevDetail = NULL;
continue;
}
// origianl
DevHandle = CreateFile(DevDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, , NULL); if (DevHandle == INVALID_HANDLE_VALUE)
{
free(DevDetail);
DevDetail = NULL;
continue;
} if (DevHandle != INVALID_HANDLE_VALUE)
{
HidD_GetAttributes(DevHandle, &DevAttributes); if (!HidD_GetPreparsedData(DevHandle, &PreparsedData))
{
CloseHandle(DevHandle);
return ;
} if (!HidP_GetCaps(PreparsedData, &Capabilities))
{
CloseHandle(DevHandle);
return ;
} //if (DevAttributes.VendorID == V_ID && DevAttributes.ProductID == P_ID)
if (DevAttributes.VendorID == UVID && DevAttributes.ProductID == UPID)
{
bSuccess = true;
CString str;
GetDlgItemTextW(IDC_INFO, str);
buf.Format(_T("Find specified Usb Hid device.\r\nVID = 0x%x, PID = 0x%x\r\n"), DevAttributes.VendorID, DevAttributes.ProductID);
str += buf;
SetDlgItemTextW(IDC_INFO, str);
break;
}
else
{
CloseHandle(DevHandle);
DevHandle = INVALID_HANDLE_VALUE;
}
} } SetupDiDestroyDeviceInfoList(DevInfo);
return bSuccess;
WriteFile
BOOL CUsbHidDlg::DeviceWriteFile()
{
CString buf;
CString temp;
BOOL bRet;
byte buffer[] = { };
UINT len = ;
DWORD dRet;
int ErrorCode; wchar_t * wbuf = NULL;
byte ReportID;
GetDlgItemTextW(IDC_OUTID, buf);
ReportID = wcstol(buf, &wbuf, ); //ReportID = _ttoi(buf); Cstring to int
buffer[] = ReportID; /* Out Report ID */ /* ok */
bRet = WriteFile(DevHandle, buffer, len, &dRet, NULL); ErrorCode = GetLastError(); if (bRet){
buf.Format(_T("WriteFile Successful, check LED 3 !! \r\n"));
temp = buf;
SetDlgItemTextW(IDC_INFO, temp);
}
else{
buf.Format(_T("WriteFile Fail !!!\r\n"));
temp = buf;
SetDlgItemTextW(IDC_INFO, temp);
} CString strMsg;
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
ErrorCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf,
,
NULL);
strMsg.Format(_T("\r\n錯誤訊息:%s\n錯誤代碼:0x%x\r\n"), lpMsgBuf, GetLastError());
buf += strMsg;
SetDlgItemTextW(IDC_INFO, buf);
LocalFree(lpMsgBuf); // 記得 free 掉空間
return bRet;
}
ReadFile
BOOL CUsbHidDlg::DeviceReadFile()
{
CString temp, buf;
BOOL bRet;
byte buffer[] = { };
UINT len = ;
DWORD dRet = ;
buffer[] = 0x01; wchar_t * wbuf = NULL;
byte ReportID;
GetDlgItemTextW(IDC_INID, buf);
ReportID = wcstol(buf, &wbuf, ); buffer[] = ReportID; /* Out Report ID */
//buffer[1] = 0x02;
//WriteFile(DevHandle, buffer, 8, &dRet, NULL); bRet = ReadFile(DevHandle, &buffer[], , &dRet, NULL);
int ErrorCode = GetLastError(); if (bRet){
buf.Format(_T("ReadFile Successful, check LED 4 !!! \r\nReadFile data = "));
temp = buf; for (int i = ; i < ; i++){
buf.Format(_T("%.2x "), buffer[i]);
temp += buf;
}
temp += _T(".\r\n"); SetDlgItemTextW(IDC_INFO, temp);
}
else
{
temp.Format(_T("ReadFile Fail !!!\r\n"));
SetDlgItemTextW(IDC_INFO, temp);
} CString strMsg;
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
ErrorCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf,
,
NULL);
strMsg.Format(_T("\r\n錯誤訊息:%s\n錯誤代碼:0x%x\r\n"), lpMsgBuf, GetLastError());
temp += strMsg;
SetDlgItemTextW(IDC_INFO, temp);
LocalFree(lpMsgBuf); // 記得 free 掉空間 return bRet;
}
OutReport
BOOL CUsbHidDlg::OutReport()
{
BOOL bRet;
CString buf;
CString temp;
byte buffer[] = { }; UINT len = ;
DWORD dRet; wchar_t * wbuf = NULL;
byte ReportID;
GetDlgItemTextW(IDC_OUTID, buf);
ReportID = wcstol(buf, &wbuf, ); buffer[] = ReportID; /* Out Report ID*/
buffer[] = 0x02;
/* ok */
bRet = HidD_SetOutputReport(DevHandle, buffer, len); if (bRet){
buf.Format(_T("Send Out Report Successful, check LED 5 !!! \r\n"));
temp = buf;
SetDlgItemTextW(IDC_INFO, temp);
}
else{
buf.Format(_T("Send Out Report Fail !!!\r\n"));
temp = buf;
SetDlgItemTextW(IDC_INFO, temp);
} /* error message print */
CString strMsg;
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf,
,
NULL);
strMsg.Format(_T("\r\n錯誤訊息:%s\n錯誤代碼:0x%x\r\n"), lpMsgBuf, GetLastError());
buf += strMsg;
SetDlgItemTextW(IDC_INFO, buf);
LocalFree(lpMsgBuf); // 記得 free 掉空間
/* error message print */ return bRet;
}
InReprot
BOOL CUsbHidDlg::InReport()
{
BOOL bRet;
CString temp, buf;
byte buffer[] = { };
DWORD dRet;
UINT len = ; wchar_t * wbuf = NULL;
byte ReportID;
GetDlgItemTextW(IDC_INID, buf);
ReportID = wcstol(buf, &wbuf, ); buffer[] = ReportID; /* IN Report ID*/ /* ok */
bRet = HidD_GetInputReport(DevHandle, buffer, len);
if (bRet){
buf.Format(_T("Get In Report Successful, check LED 6 !!! \r\n"));
temp = buf;
SetDlgItemTextW(IDC_INFO, temp);
}
else
{
buf.Format(_T("Get In Report Fail !!! \r\n"));
temp = buf;
SetDlgItemTextW(IDC_INFO, temp);
} /* error message print */
CString strMsg;
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf,
,
NULL);
strMsg.Format(_T("\r\n錯誤訊息:%s\n錯誤代碼:0x%x\r\n"), lpMsgBuf, GetLastError());
buf += strMsg;
SetDlgItemTextW(IDC_INFO, buf);
LocalFree(lpMsgBuf); // 記得 free 掉空間
/* error message print */
return bRet;
}
(USB HID) VC++ 使用 SetupAPI 操作 USB HID Device的更多相关文章
- 一个DELPHI操作USB摄像头类
最近在使用Usb摄像头做了个项目,其中写了一个操作usb摄像头类分享给大家 {*******************************************************} { } ...
- VC++ 6.0 C8051F340 USB 通信 CAN 数据解析
// HelloWorld.cpp : Defines the entry point for the console application. // /*********************** ...
- VC++ 6.0 C8051F340 USB PC侧通信 Demo
// HelloWorld.cpp : Defines the entry point for the console application. // /*********************** ...
- USB系列之二:读取USB设备的描述符
在前面的文章中,我们已经给出了USB协议的链接地址,从这篇文章起,我们会涉及到许多USB 1.1的内容,我们的指导思想是先从熟悉USB 1.1协议入手,先使用现成的HCD和USBD,直接面对客户端驱动 ...
- Linux usb子系统(一) _写一个usb鼠标驱动
USB总线是一种典型的热插拔的总线标准,由于其优异的性能几乎成为了当下大小设备中的标配. USB的驱动可以分为3类:SoC的USB控制器的驱动,主机端USB设备的驱动,设备上的USB Gadget驱动 ...
- 你的USB设备还安全吗?USB的安全性已从根本上被打破!
前言: USB设备使用方便,但也可能被用来携带恶意软件.病毒,感染计算机系统.通过禁用自动播放功能.杀毒软件查杀.不定期的对设备进行格式化等操作可以确保它是干净的.但它存在的安全问题要比我们想象的更深 ...
- Linux usb子系统(二):USB设备驱动usb-skeleton.c
usb驱动分为通过usbfs操作设备的用户空间驱动,内核空间的内核驱动.两者不能同时进行,否则容易引发对共享资源访问的问题,死锁!使用了内核驱动,就不能在usbfs里驱动该设备. 下面转载的一篇分析u ...
- android的USB MTP && USB CDC/USBnet(ECM, NCM, ACM) && USB gardget
MTP的全称是Media Transfer Protocol(媒体传输协议),它是微软公司提出的一套媒体文件传输协议.早在智能手机普及前,数码相机和MP3播放器等都使用了MTP的前身PTP(Pictu ...
- Linux USB 驱动开发(一)—— USB设备基础概念【转】
本文转载自:http://blog.csdn.net/zqixiao_09/article/details/50984074 在终端用户看来,USB设备为主机提供了多种多样的附加功能,如文件传输,声音 ...
随机推荐
- laravel @if
- IO引脚复用和映射
1.端口复用 这些外设包括ADC,DAC以及串口等等. 查找STM32F429数据手册可以找到相关IO口的复用功能引脚. 注意:除ADC和DAC要配置成模拟通道外,其他的所有外设都要配置成复用功能.
- 轻松搭建持续集成工具jenkins
1.Jenkins介绍1)什么是持续集成随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题.尤其是近些年来,敏捷(Agile) 在软 ...
- [GO]gomaxprocs的使用
package main import ( "runtime" "fmt" ) func main() { n := runtime.GOMAXPROCS()/ ...
- 编写高质量代码改善C#程序的157个建议——建议116:避免用非对称算法加密文件
建议116:避免用非对称算法加密文件 MD5值或者说HASH值是一种不可逆的算法.如果需要从密文还原成明文,那么就需要对称和非对称这两类可逆算法了. 对称算法示意图: 在对称算法中,首先需要发送方和接 ...
- MyEclipse中安装反编译插件
如何查看MyEclipse中Spring等框架的源文件. 首先先下载一个插件:http://pan.baidu.com/share/link?shareid=644034672&uk=3508 ...
- Android自定义组件之自动换行及宽度自适应View:WordWrapView
目的: 自定义一个ViewGroup,里面的子view都是TextView,每个子view TextView的宽度随内容自适应且每行的子View的个数自适应,并可以自动换行 一:效果图 二:代码 整 ...
- 基于JSP+Servlet开发高校社团管理系统(前台+后台) 源码
基于JSP+Servlet开发高校社团管理系统(前台+后台): 开发环境: Windows操作系统 开发工具:Eclipse/MyEclipse+Jdk+Tomcat+MYSQL数据库 运行效果 ...
- Centos 7 修改默认的运行级别
Runlevel System State 0 Halt the system 1 Single user mode 2 Basic multi user mode 3 Multi user mode ...
- 两款Mongodb可视化工具
在某些场景下,相比传统的关系数据库和NoSQL数据库,Mongodb拥有不可替代的优势. 例如,最近我需要为收集的大量网站进行分类.实际情况是,一个网站可能同时有多个标签,想象一下新浪网,它既是门户站 ...