⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uc.cpp

📁 can总线与usb总线格式转换
💻 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 + -