(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设备为主机提供了多种多样的附加功能,如文件传输,声音 ...
随机推荐
- [erlang 002]gen_server中何时会跑到terminate函数
一.从start方法产出的独立gen_server进程 实验代码: %%%-------------------------------------- %%% @Module : %%% @Auth ...
- Linux分区挂载点介绍
一.Linux分区挂载点介绍 Linux分区挂载点介绍,推荐容量仅供参考不是绝对,跟各系统用途以及硬盘空间配额等因素实际调整: 分区类型 介绍 备注 /boot 启动分区 一般设置100M-200M, ...
- sqlserver 时间函数用法
1.DATEADD(datepart,number,date) 现在,我们希望向 "OrderDate" 添加 2 天,这样就可以找到付款日期,我们使用如下 SELECT 语句: ...
- myeclipse10.X以上的破解方法
破解补丁下载地址:http://pan.baidu.com/s/1dDzVP3z 本文使用的破解补丁对MyEclipse Standard/ Professional/ Blue/ Spring的10 ...
- p4364 [九省联考2018]IIIDX
传送门 分析 我们先考虑如果所有数都不相同我们应该怎么办 我们可以直接贪心的在每个点放可行的最大权值 但是题目要求可以有相同的数 我们可以考虑每次让当前节点可发且尽量大的同时给兄弟节点留的数尽量大 我 ...
- Codeigniter框架前后台部署(多目录部署)
个网站一般包含前台和后台并且访问的url是不同的,Codeigniter怎么来部署呢? 在网上看到了一篇比较好的文章: 在下载好的ci的根目录建立一个目录 admin 将application目录中的 ...
- jQuery-File-Upload外部按钮触发上传
这个控件功能还不错,但是对于外部调用上传有点压力. 比如说,他可以实现在添加一个文件后为文件添加一个上传按钮,这个是写在add中的,可以调用data.submit()提交数据 但是如果我要实现外部按钮 ...
- Android-ListView-SimpleCursorAdapter
在上篇博客,Android-ListView-SimpleAdapter,中介绍了SimpleAdapter的使用操作(SimpleAdapter面向的数据是非Cursor数据),而SimpleCur ...
- C#多线程学习(四) 多线程的自动管理(线程池)
在多线程的程序中,经常会出现两种情况: 一种情况: 应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应 这一般使用ThreadPo ...
- JS设置localStorage有效期
localStorage是一个没有时间限制的数据存储,如果没有手动删除它,它将永久保存. 但是有些时候我们又需要它在一段时间后自动删除,这里我们可以对它进行扩展. var date = new Dat ...