帮我写一个 hid.dll 导出函数源码
时间: 2023-06-27 12:04:45 浏览: 175
好的,以下是一个简单的 `hid.dll` 导出函数的示例代码,供参考:
```c
#include <Windows.h>
#include <hidsdi.h>
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
// DLL 初始化
break;
case DLL_PROCESS_DETACH:
// DLL 卸载
break;
case DLL_THREAD_ATTACH:
// 新线程创建
break;
case DLL_THREAD_DETACH:
// 线程结束
break;
}
return TRUE;
}
// 导出函数:获取 HID 设备信息
extern "C" __declspec(dllexport) BOOL GetHidDeviceInfo(
DWORD dwVendorId, // 设备厂商 ID
DWORD dwProductId, // 设备产品 ID
PHIDD_ATTRIBUTES pHidAttributes // 输出设备属性结构体
)
{
BOOL bResult = FALSE;
HDEVINFO hDeviceInfo = NULL;
// 枚举所有 HID 设备
hDeviceInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_HID, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (hDeviceInfo == INVALID_HANDLE_VALUE)
{
return FALSE;
}
// 遍历所有 HID 设备
DWORD dwIndex = 0;
SP_DEVICE_INTERFACE_DATA deviceInterfaceData = { 0 };
deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
while (SetupDiEnumDeviceInterfaces(hDeviceInfo, NULL, &GUID_DEVINTERFACE_HID, dwIndex, &deviceInterfaceData))
{
// 获取设备接口数据
DWORD dwRequiredSize = 0;
SetupDiGetDeviceInterfaceDetail(hDeviceInfo, &deviceInterfaceData, NULL, 0, &dwRequiredSize, NULL);
if (dwRequiredSize == 0)
{
break;
}
PSP_DEVICE_INTERFACE_DETAIL_DATA pDeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LPTR, dwRequiredSize);
if (pDeviceInterfaceDetailData == NULL)
{
break;
}
pDeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
if (SetupDiGetDeviceInterfaceDetail(hDeviceInfo, &deviceInterfaceData, pDeviceInterfaceDetailData, dwRequiredSize, NULL, NULL))
{
// 打开设备
HANDLE hDevice = CreateFile(pDeviceInterfaceDetailData->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDevice != INVALID_HANDLE_VALUE)
{
// 获取设备属性
HIDD_ATTRIBUTES hidAttributes = { 0 };
hidAttributes.Size = sizeof(HIDD_ATTRIBUTES);
if (HidD_GetAttributes(hDevice, &hidAttributes))
{
// 比较设备厂商 ID 和产品 ID
if (hidAttributes.VendorID == dwVendorId && hidAttributes.ProductID == dwProductId)
{
// 输出设备属性
CopyMemory(pHidAttributes, &hidAttributes, sizeof(HIDD_ATTRIBUTES));
bResult = TRUE;
CloseHandle(hDevice);
break;
}
}
CloseHandle(hDevice);
}
}
LocalFree(pDeviceInterfaceDetailData);
++dwIndex;
}
SetupDiDestroyDeviceInfoList(hDeviceInfo);
return bResult;
}
```
此示例代码中,我们定义了一个名为 `GetHidDeviceInfo` 的函数,该函数可以用来获取指定厂商 ID 和产品 ID 的 HID 设备的属性信息。我们将该函数作为 `hid.dll` 的导出函数,供其他程序调用。
需要注意的是,在 `DllMain` 函数中,我们可以进行 DLL 的初始化和卸载工作,例如打开和关闭一些资源,但是我们需要避免在此函数中进行太多的操作,以免影响系统的性能和稳定性。
阅读全文