在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;
}

最新文章

  1. BootLoader 详解(1)
  2. [C] c99int(让VC等编译器自动兼容C99的整数类型)V1.02。源码托管到github、添加CMake编译配置文件、使用doxygen规范注释
  3. HDU1045 Fire Net(DFS)
  4. C#调用java程序
  5. php 中cookie和session的用法比较
  6. Javascript Basic Operation Extraction
  7. 20151212jquery学习笔记--工具函数
  8. 2015/11/06 社保查询系统持续 挂机ing
  9. Mac搭建Git/GitHub全过程
  10. 安装VMware vCenter过程设置数据库方法
  11. python 技巧 之 pyCharm快速添加第三方库和插件
  12. mongodb与mysql相比的优缺点
  13. spring-mvc 集成 activeMq 常见问题 + 解决方案 (仅供参考)
  14. 解决mongodb的安装mongod命令不是内部或外部命令
  15. Loj #2324. 「清华集训 2017」小 Y 和二叉树
  16. 点评cat系列-简介
  17. spring-data-mongodb与mongo shell的对应关系
  18. Hadoop学习------Hadoop安装方式之(二):伪分布部署
  19. Linux 下磁盘挂载
  20. 2016_NENU_CS_3

热门文章

  1. hadoop开发环境部署——通过eclipse远程连接hadoop2.7.3进行开发
  2. Solidity safesub防止溢出
  3. Linux ag命令
  4. Python爬虫实战八之利用Selenium抓取淘宝匿名旺旺
  5. html传参数 js工具类
  6. 深入理解java虚拟机(十一) 方法调用-解析调用与分派调用
  7. FPGA的时钟质量对设计的影响
  8. 织梦CMS让channelartlist标签支持currentstyle【转】
  9. django+echarts
  10. [C#]C#中字符串的操作