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

📄 hidtestdlg.cpp

📁 USB汇编控制 主控采用台湾义隆电子有限公司的EM78M612
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		return ;
	}

	//取得设备的代号
	HANDLE deviceHandle;
	deviceHandle = CreateFile(deviceDetail->DevicePath, //
								GENERIC_READ | GENERIC_WRITE,
								FILE_SHARE_WRITE | FILE_SHARE_READ,
								NULL,
								OPEN_EXISTING,
								0,
								NULL
								);
	if(deviceHandle == INVALID_HANDLE_VALUE)//失败,释放HID信息的结构数组和释放deviceDetail并返回
	{
		SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
		free(deviceDetail);
		return ;
	}

	//取得厂商和产品的ID
	HIDD_ATTRIBUTES deviceAttributes;
	HidD_GetAttributes(deviceHandle, &deviceAttributes);

	//取得设备能力的缓冲区指针
	PHIDP_PREPARSED_DATA preparsedData;
	HidD_GetPreparsedData(deviceHandle, &preparsedData);

	//取得设备能力
	HIDP_CAPS Capabilities;
	HidP_GetCaps(preparsedData, &Capabilities);

	//判断HID设备
	if(deviceAttributes.VendorID == DefaultVendorID && deviceAttributes.ProductID == DefaultProductID)
	{
		
	}
	else
	{
		HidD_FreePreparsedData(preparsedData);
		SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
		free(deviceDetail);
		CloseHandle(deviceHandle);
	}

	//SetFeature
	unsigned char FeatureBuffer[9];
	memset(FeatureBuffer, 0x2f, 9);
	char a = '1';
	FeatureBuffer[1] = a;
	FeatureBuffer[0] = 0x00;
	if(HidD_SetFeature(deviceHandle, FeatureBuffer, Capabilities.FeatureReportByteLength))
	{
		ShowMessage("Set Feature is ok!\r\n");
	}
	else
	{
		ShowMessage("Set Feature is failure!\r\n");
	}
	//释放preparsedData
	HidD_FreePreparsedData(preparsedData);
	SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
	free(deviceDetail);
	CloseHandle(deviceHandle);
	
}

void CHIDTestDlg::OnButtonGetfeature() 
{
	// TODO: Add your control notification handler code here
	//取得HID类的GUID
	GUID HID_GUID;
	HidD_GetHidGuid(&HID_GUID);

	//取得HID信息的结构数组
	HDEVINFO hardwareDeviceInfoSet;
	hardwareDeviceInfoSet = SetupDiGetClassDevs(&HID_GUID, //IN LPGUID ClassGuid
												NULL, //OPTIONAL IN PCTSTR Enumerator
												NULL, //OPTIONAL IN HWND hwndParent
												(DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)//OPTIONAL IN DWORD Flags
												);

	//识别HID接口
	SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
	deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
	int result;
	result = SetupDiEnumDeviceInterfaces(hardwareDeviceInfoSet, //IN HDEVINFO
											NULL, //IN PSP_DEVINFO_DATA
											&HID_GUID,  //OPTIONAL IN LPGUID
											m_iElanIndex, //IN DWORD
											&deviceInterfaceData //OUT PSP_DEVICE_INTERFACE_DATA
											);
	if(result == false)//失败,释放HID信息的结构数组并返回
	{
		SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
		return ;
	}

	//取得设备的路径
	DWORD length;
	PSP_DEVICE_INTERFACE_DETAIL_DATA deviceDetail;
	//获得deviceDetail长度
	result = SetupDiGetDeviceInterfaceDetail(hardwareDeviceInfoSet, //INHDEVINFO
												&deviceInterfaceData, //IN PSP_DEVICE_INTERFACE_DATA
												NULL, //OUT PSP_DEVICE_INTERFACE_DETAIL_DATA
												0, //OPTIONAL IN DWORD
												&length, //OUT PDWORD
												0// OPTIONAL OUT PSP_DEVINFO_DATA
												);
	deviceDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(length);
	deviceDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
	result = SetupDiGetDeviceInterfaceDetail(hardwareDeviceInfoSet, //INHDEVINFO
												&deviceInterfaceData, //IN PSP_DEVICE_INTERFACE_DATA
												deviceDetail, //OUT PSP_DEVICE_INTERFACE_DETAIL_DATA
												length, //OPTIONAL IN DWORD
												&length, //OUT PDWORD
												0// OPTIONAL OUT PSP_DEVINFO_DATA
												);
	if(result == false)//失败,释放HID信息的结构数组和释放deviceDetail并返回
	{
		SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
		free(deviceDetail);
		return ;
	}

	//取得设备的代号
	HANDLE deviceHandle;
	deviceHandle = CreateFile(deviceDetail->DevicePath, //
								GENERIC_READ | GENERIC_WRITE,
								FILE_SHARE_WRITE | FILE_SHARE_READ,
								NULL,
								OPEN_EXISTING,
								0,
								NULL
								);
	if(deviceHandle == INVALID_HANDLE_VALUE)//失败,释放HID信息的结构数组和释放deviceDetail并返回
	{
		SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
		free(deviceDetail);
		return ;
	}

	//取得厂商和产品的ID
	HIDD_ATTRIBUTES deviceAttributes;
	HidD_GetAttributes(deviceHandle, &deviceAttributes);

	//取得设备能力的缓冲区指针
	PHIDP_PREPARSED_DATA preparsedData;
	HidD_GetPreparsedData(deviceHandle, &preparsedData);

	//取得设备能力
	HIDP_CAPS Capabilities;
	HidP_GetCaps(preparsedData, &Capabilities);

	//判断HID设备
	if(deviceAttributes.VendorID == 0x1267 && deviceAttributes.ProductID == 0x0230)
	{
		
	}
	else
	{
		HidD_FreePreparsedData(preparsedData);
		SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
		free(deviceDetail);
		CloseHandle(deviceHandle);
	}

	//GetFeature
	unsigned char FeatureBuffer[9];
	memset(FeatureBuffer, 0x2f, 9);
	
	FeatureBuffer[0] = 0x00;
	if(HidD_GetFeature(deviceHandle, FeatureBuffer, Capabilities.FeatureReportByteLength))
	{
		ShowMessage("Get Feature is ok!\r\nthe Feature Data is:");
		CString str;
		for(int i = 1; i < 9; i++)
		{
			str.Format("%x  ", FeatureBuffer[i]);
			ShowMessage(str);
		}
		ShowMessage("\r\n");
	}
	else
	{
		ShowMessage("Get Feature is failure!\r\n");
	}
	//释放preparsedData
	HidD_FreePreparsedData(preparsedData);
	SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
	free(deviceDetail);
	CloseHandle(deviceHandle);
	
}

void CHIDTestDlg::OnButtonClear() 
{
	// TODO: Add your control notification handler code here
	CEdit * editMessage = (CEdit*)GetDlgItem(IDC_EDIT_MESSAGE);
	editMessage->SetWindowText("");
}

void CHIDTestDlg::ShowMessage(CString str)
{
	CEdit * editMessage = (CEdit*)GetDlgItem(IDC_EDIT_MESSAGE);
	editMessage->ReplaceSel(str);
}

void CHIDTestDlg::ReadFileThread()
{
	//取得HID类的GUID
	GUID HID_GUID;
	HidD_GetHidGuid(&HID_GUID);

	//取得HID信息的结构数组
	HDEVINFO hardwareDeviceInfoSet;
	hardwareDeviceInfoSet = SetupDiGetClassDevs(&HID_GUID, //IN LPGUID ClassGuid
												NULL, //OPTIONAL IN PCTSTR Enumerator
												NULL, //OPTIONAL IN HWND hwndParent
												(DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)//OPTIONAL IN DWORD Flags
												);

	//识别HID接口
	SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
	deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
	int result;
	result = SetupDiEnumDeviceInterfaces(hardwareDeviceInfoSet, //IN HDEVINFO
											NULL, //IN PSP_DEVINFO_DATA
											&HID_GUID,  //OPTIONAL IN LPGUID
											m_iElanIndex, //IN DWORD
											&deviceInterfaceData //OUT PSP_DEVICE_INTERFACE_DATA
											);
	if(result == false)//失败,释放HID信息的结构数组并返回
	{
		SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
		return ;
	}

	//取得设备的路径
	DWORD length;
	PSP_DEVICE_INTERFACE_DETAIL_DATA deviceDetail;
	//获得deviceDetail长度
	result = SetupDiGetDeviceInterfaceDetail(hardwareDeviceInfoSet, //INHDEVINFO
												&deviceInterfaceData, //IN PSP_DEVICE_INTERFACE_DATA
												NULL, //OUT PSP_DEVICE_INTERFACE_DETAIL_DATA
												0, //OPTIONAL IN DWORD
												&length, //OUT PDWORD
												0// OPTIONAL OUT PSP_DEVINFO_DATA
												);
	deviceDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(length);
	deviceDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
	result = SetupDiGetDeviceInterfaceDetail(hardwareDeviceInfoSet, //INHDEVINFO
												&deviceInterfaceData, //IN PSP_DEVICE_INTERFACE_DATA
												deviceDetail, //OUT PSP_DEVICE_INTERFACE_DETAIL_DATA
												length, //OPTIONAL IN DWORD
												&length, //OUT PDWORD
												0// OPTIONAL OUT PSP_DEVINFO_DATA
												);
	if(result == false)//失败,释放HID信息的结构数组和释放deviceDetail并返回
	{
		SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
		free(deviceDetail);
		return ;
	}

	//取得设备的代号
	HANDLE deviceHandle;
	deviceHandle = CreateFile(deviceDetail->DevicePath, //
								GENERIC_READ | GENERIC_WRITE,
								FILE_SHARE_WRITE | FILE_SHARE_READ,
								NULL,
								OPEN_EXISTING,
								0,//FILE_FLAG_OVERLAPPED,
								NULL
								);
	if(deviceHandle == INVALID_HANDLE_VALUE)//失败,释放HID信息的结构数组和释放deviceDetail并返回
	{
		SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
		free(deviceDetail);
		return ;
	}

	//取得厂商和产品的ID
	HIDD_ATTRIBUTES deviceAttributes;
	HidD_GetAttributes(deviceHandle, &deviceAttributes);

	//取得设备能力的缓冲区指针
	PHIDP_PREPARSED_DATA preparsedData;
	HidD_GetPreparsedData(deviceHandle, &preparsedData);

	//取得设备能力
	HIDP_CAPS Capabilities;
	HidP_GetCaps(preparsedData, &Capabilities);

	//判断HID设备
	if(deviceAttributes.VendorID == DefaultVendorID && deviceAttributes.ProductID == DefaultProductID)
	{
		
	}
	else
	{
		HidD_FreePreparsedData(preparsedData);
		SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
		free(deviceDetail);
		CloseHandle(deviceHandle);
	}

	//ReadFile using Thread
	DWORD readByte = 0;
	//unsigned char InputBuffer[9];
	unsigned char *InputBuffer = new unsigned char[Capabilities.InputReportByteLength];
	memset(InputBuffer, 0xff, Capabilities.InputReportByteLength);
	InputBuffer[0] = 0x00;

	m_bReadFileThread = true;
	while(m_bReadFileThread)
	{
		ReadFile(deviceHandle, InputBuffer, Capabilities.InputReportByteLength, &readByte, NULL);
		ShowMessage("Get Report(using thread) is ok!\r\nthe Input Data is:");
		CString str;
		for(int i = 1; i < Capabilities.InputReportByteLength; i++)
		{
			str.Format("%x  ", InputBuffer[i]);
			ShowMessage(str);
		}
		ShowMessage("\r\n");
	}
	delete []InputBuffer;
	//释放preparsedData
	HidD_FreePreparsedData(preparsedData);
	SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
	free(deviceDetail);
	CloseHandle(deviceHandle);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -