在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的更多相关文章

  1. 一个DELPHI操作USB摄像头类

    最近在使用Usb摄像头做了个项目,其中写了一个操作usb摄像头类分享给大家 {*******************************************************} { } ...

  2. VC++ 6.0 C8051F340 USB 通信 CAN 数据解析

    // HelloWorld.cpp : Defines the entry point for the console application. // /*********************** ...

  3. VC++ 6.0 C8051F340 USB PC侧通信 Demo

    // HelloWorld.cpp : Defines the entry point for the console application. // /*********************** ...

  4. USB系列之二:读取USB设备的描述符

    在前面的文章中,我们已经给出了USB协议的链接地址,从这篇文章起,我们会涉及到许多USB 1.1的内容,我们的指导思想是先从熟悉USB 1.1协议入手,先使用现成的HCD和USBD,直接面对客户端驱动 ...

  5. Linux usb子系统(一) _写一个usb鼠标驱动

    USB总线是一种典型的热插拔的总线标准,由于其优异的性能几乎成为了当下大小设备中的标配. USB的驱动可以分为3类:SoC的USB控制器的驱动,主机端USB设备的驱动,设备上的USB Gadget驱动 ...

  6. 你的USB设备还安全吗?USB的安全性已从根本上被打破!

    前言: USB设备使用方便,但也可能被用来携带恶意软件.病毒,感染计算机系统.通过禁用自动播放功能.杀毒软件查杀.不定期的对设备进行格式化等操作可以确保它是干净的.但它存在的安全问题要比我们想象的更深 ...

  7. Linux usb子系统(二):USB设备驱动usb-skeleton.c

    usb驱动分为通过usbfs操作设备的用户空间驱动,内核空间的内核驱动.两者不能同时进行,否则容易引发对共享资源访问的问题,死锁!使用了内核驱动,就不能在usbfs里驱动该设备. 下面转载的一篇分析u ...

  8. android的USB MTP && USB CDC/USBnet(ECM, NCM, ACM) && USB gardget

    MTP的全称是Media Transfer Protocol(媒体传输协议),它是微软公司提出的一套媒体文件传输协议.早在智能手机普及前,数码相机和MP3播放器等都使用了MTP的前身PTP(Pictu ...

  9. Linux USB 驱动开发(一)—— USB设备基础概念【转】

    本文转载自:http://blog.csdn.net/zqixiao_09/article/details/50984074 在终端用户看来,USB设备为主机提供了多种多样的附加功能,如文件传输,声音 ...

随机推荐

  1. 270. Closest Binary Search Tree Value 二叉搜索树中,距离目标值最近的节点

    [抄题]: Given a non-empty binary search tree and a target value, find the value in the BST that is clo ...

  2. spring4-2-bean配置-11-基于注解

  3. code2800 送外卖

    首先,对图进行一次Floyd(g[][]是图) 1.dfs:(u是当前在的节点,d是已经走的路程) void dfs(int u,int d){ if(d>=ans)return; bool f ...

  4. Mac Sublime 相关资源

    MAC上安装并破解最新SublimeText3103版本 http://blog.csdn.net/yanzi1225627/article/details/50703942 Mac版的Sublime ...

  5. sscanf高级用法级正则表达式

    sscanf高级用法级正则表达式  摘自:https://www.cnblogs.com/bluestorm/p/6864540.html sscanf与scanf类似,都是用于输入的,只是后者以屏幕 ...

  6. jstack调试core文件

    摘自:https://stackoverflow.com/questions/37331266/jstack-throws-exception-interrogating-a-core // 错误示例 ...

  7. linux centOS下怎么配置web服务器

    | 浏览:4503 | 更新:2011-12-07 17:45 1 2 3 分步阅读 下是我在配置web服务时作的一些记录,高手飘开或者看了指点一下,不胜感激,第一次配置,很多细节需要自己优化.适合环 ...

  8. Mac下在zsh中配置adb命令

    Mac下自带的终端默认黑白色的,对于一个技术宅来说不能忍啊.然后换成了iTerm,安装上了zsh,安装后界面如下: 这里写图片描述 但是常用的adb命令却找不到了,还向github上提了issue,下 ...

  9. Memcached在Windows下的配置和使用(转)

    出处:http://www.cnblogs.com/sunniest/p/4154209.html Memcached学习笔记---- 安装和配置 首先,下载Memcached相关文件. 打开控制台, ...

  10. review一个javascript功能函数

    近半年来一直觉得自己在技术上好像左右挣扎,技术没啥提升,看书看不进,自学还挺慢.写出来的东西,自己都觉得不满意.让自己也用庸人自扰的感觉. 最近,在工作中,有一个小小的功能需要实现,这个功能非常简单, ...