目标:编写一个枚举系统中所有USB HID设备的程序。在编写过程中遇到编译链接无法通过的情况,尝试各种方法都不成功。 Google上不去,Baidu的方法基本上都尝试了一遍,产生问题的原因大约是 DDK(3790.1830 算是比较老的版本)中的库和VS2008(Express版本)有冲突。最后琢磨了一下,不妨直接将用到的 Lib 和函数(这个例子只用了一个HidD_GetHidGuid,在 hidsdi.h 中定义),直接放到程序中。结果居然很好用~
#include "stdafx.h" #include <stdio.h> #include <tchar.h> #include <windows.h> #include <setupapi.h> extern "C" { void __stdcall HidD_GetHidGuid ( OUT LPGUID HidGuid ); typedef struct _HIDD_ATTRIBUTES { ULONG Size; // = sizeof (struct _HIDD_ATTRIBUTES) // // Vendor ids of this hid device // USHORT VendorID; USHORT ProductID; USHORT VersionNumber; // // Additional fields will be added to the end of this structure. // } HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES; BOOLEAN __stdcall HidD_GetAttributes ( IN HANDLE HidDeviceObject, OUT PHIDD_ATTRIBUTES Attributes ); } #pragma comment( lib, "hid.lib" ) #pragma comment( lib, "setupapi.lib" ) #define ShowError() ShowError_(_T(__FILE__),__LINE__) void ShowError_(LPCTSTR file, long line) { LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS , NULL, GetLastError(), 0, (LPTSTR)&lpMsgBuf, 0, NULL ); _tprintf( _T("---ERROR %s(%ld): %s\n"), file, line, (LPCTSTR)lpMsgBuf ); LocalFree( lpMsgBuf ); } int main(array<System::String ^> ^args) { GUID HidGuid; //获取HID设备的接口类GUDI HidD_GetHidGuid(&HidGuid); //输出一下看看GUID printf("HID GUID: {%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}\n" , HidGuid.Data1, HidGuid.Data2, HidGuid.Data3 , HidGuid.Data4[0], HidGuid.Data4[1], HidGuid.Data4[2], HidGuid.Data4[3], HidGuid.Data4[4] , HidGuid.Data4[5], HidGuid.Data4[6], HidGuid.Data4[7] ); //根据获得的GUID枚举HID设备 HDEVINFO hDevInfo = SetupDiGetClassDevs( &HidGuid, NULL, 0, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE ); if( INVALID_HANDLE_VALUE != hDevInfo ) { SP_DEVICE_INTERFACE_DATA strtInterfaceData = { sizeof(SP_DEVICE_INTERFACE_DATA) }; for( DWORD index=0; SetupDiEnumDeviceInterfaces(hDevInfo,NULL,&HidGuid,index,&strtInterfaceData); ++index ) { char buf[1000]; SP_DEVICE_INTERFACE_DETAIL_DATA& strtDetailData = (SP_DEVICE_INTERFACE_DETAIL_DATA&)buf[0]; strtDetailData.cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); if( SetupDiGetDeviceInterfaceDetail(hDevInfo,&strtInterfaceData,&strtDetailData,_countof(buf),NULL,NULL) ) { _tprintf( _T("[%d] path: %s\n"), index, strtDetailData.DevicePath ); HANDLE hUsb = CreateFile( strtDetailData.DevicePath, 0//GENERIC_READ|GENERIC_WRITE , FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if( INVALID_HANDLE_VALUE != hUsb ) { // 查询设备标识 HIDD_ATTRIBUTES strtAttrib = { sizeof(HIDD_ATTRIBUTES) }; if( HidD_GetAttributes(hUsb,&strtAttrib) ) { _tprintf( _T("VendorID : %hX\n"), strtAttrib.VendorID ); _tprintf( _T("ProductID: %hX\n"), strtAttrib.ProductID ); _tprintf( _T("VerNumber: %hX\n"), strtAttrib.VersionNumber ); } else ShowError(); CloseHandle( hUsb ); } else ShowError(); } else ShowError(); } if( GetLastError() != ERROR_NO_MORE_ITEMS ) ShowError(); SetupDiDestroyDeviceInfoList( hDevInfo ); } else ShowError(); system("PAUSE"); return 0; }
下载 HidTest
参考:
1.http://blog.csdn.net/xuxinhua/article/details/6329182 转: vs2008 hidsdi.h 问题