📄 uc.cpp
字号:
// uc.cpp : 定义 DLL 应用程序的入口点。
//
#include "stdafx.h"
#include "uc.h"
extern "C"{
#include "hidsdi.h"
#include <setupapi.h>
}
//厂商ID与产品ID
#define MyVendorID 0x0471
#define MyProductID 0x0666
//device handle
HANDLE DeviceHandle =INVALID_HANDLE_VALUE;
PHIDP_PREPARSED_DATA PreparsedData;
HIDP_CAPS Capabilities;
BOOL bInit = FALSE;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
UC_API BOOL UC_InitDevice()
{
if (bInit) return TRUE;
//与hid设备相关的变量声明
// ULONG Result;
ULONG MemberIndex = 0;
ULONG Length,Required;
GUID HidGuid;
HDEVINFO hDevInfo;
SP_DEVICE_INTERFACE_DATA devInfoData;
PSP_DEVICE_INTERFACE_DETAIL_DATA detailData;
HIDD_ATTRIBUTES Attributes;
/*取得HID类别的GUID*/
HidD_GetHidGuid (&HidGuid);
/*取得HID信息的结构数组*/
hDevInfo = SetupDiGetClassDevs(&HidGuid,NULL,NULL,DIGCF_PRESENT|DIGCF_INTERFACEDEVICE);
if (hDevInfo == INVALID_HANDLE_VALUE) return FALSE;
/*识别HID接口*/
devInfoData.cbSize = sizeof(devInfoData);
if(!SetupDiEnumDeviceInterfaces(hDevInfo,0,&HidGuid,MemberIndex,&devInfoData)) return FALSE;;
/*取得设备路径*/
SetupDiGetDeviceInterfaceDetail(hDevInfo,&devInfoData,NULL,0,&Length,NULL);//取得Length的数值,此调用会传回一个"buffer too small"的错误,但可以忽略
detailData=(PSP_DEVICE_INTERFACE_DETAIL_DATA) new BYTE[Length];//使用传回的Length数值,配置hDevInfo结构的内存
detailData -> cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);//设置detailData结构的cbSize
if (SetupDiGetDeviceInterfaceDetail(hDevInfo,&devInfoData,detailData,Length,&Required,NULL)) //再次调用
{
/*取得设备的代号*/
DeviceHandle=CreateFile(detailData->DevicePath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
if (DeviceHandle != INVALID_HANDLE_VALUE)
{
/*取得产商与产品ID*/
Attributes.Size = sizeof(Attributes);
if(HidD_GetAttributes(DeviceHandle,&Attributes))
{
if ((Attributes.VendorID==MyVendorID)&&(Attributes.ProductID==MyProductID))
{
/*取得包含设备能力的缓冲区指针*/
HidD_GetPreparsedData(DeviceHandle,&PreparsedData);
/*取得设备的能力*/
HidP_GetCaps(PreparsedData,&Capabilities);
bInit = TRUE;
}
else
{
CloseHandle(DeviceHandle);
SetupDiDestroyDeviceInfoList(hDevInfo);
delete detailData;
return FALSE;
}
}
else
{
CloseHandle(DeviceHandle);
SetupDiDestroyDeviceInfoList(hDevInfo);
delete detailData;
return FALSE;
}
}
else
{
SetupDiDestroyDeviceInfoList(hDevInfo);
delete detailData;
return FALSE;
}
}
else
{
delete detailData;
return FALSE;
}
SetupDiDestroyDeviceInfoList(hDevInfo);
delete detailData;
return TRUE;
}
UC_API BOOL UC_DeleteDevice()
{
if (DeviceHandle != INVALID_HANDLE_VALUE)
{
HidD_FreePreparsedData(PreparsedData);
CloseHandle(DeviceHandle);
}
bInit = FALSE;
return TRUE;
}
UC_API BOOL UC_ReadDevice(LPBYTE lpBuffer,DWORD dwNumberOfBytesToRead)
{
DWORD BytesRead = 0;
if(DeviceHandle == INVALID_HANDLE_VALUE) return FALSE;
while(dwNumberOfBytesToRead>Capabilities.InputReportByteLength)
{
if(!ReadFile(DeviceHandle,lpBuffer,Capabilities.InputReportByteLength,&BytesRead,NULL))
return FALSE;
dwNumberOfBytesToRead -= BytesRead;
lpBuffer += BytesRead;
}
if(!ReadFile(DeviceHandle,lpBuffer,dwNumberOfBytesToRead,&BytesRead,NULL))
return FALSE;
return TRUE;
}
UC_API BOOL UC_WriteDevice(LPBYTE lpBuffer,DWORD dwNumberOfBytesToWrite)
{
DWORD BytesWritten = 0;
if(DeviceHandle == INVALID_HANDLE_VALUE) return FALSE;
while (dwNumberOfBytesToWrite>Capabilities.OutputReportByteLength)
{
if( !WriteFile(DeviceHandle,lpBuffer,Capabilities.OutputReportByteLength,&BytesWritten,NULL))
return FALSE;
dwNumberOfBytesToWrite -= BytesWritten;
lpBuffer += BytesWritten;
}
if(!WriteFile(DeviceHandle,lpBuffer,dwNumberOfBytesToWrite,&BytesWritten,NULL))
return FALSE;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -