目标:编写一个枚举系统中所有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 问题
