读书人

Hid设备再查找解决方法

发布时间: 2013-01-25 15:55:29 作者: rapoo

Hid设备再查找
GUID HidGuid;
bool beFind=false;//找到USB设备标志!
bool res=false;
CString enumStr;
ULONG need=0;
int enumIndex=0;//枚举序号!
HDEVINFO pInfo;
HIDD_ATTRIBUTES pAttr;
HIDP_CAPS hCaps;
PHIDP_PREPARSED_DATA pParsendData;


HidD_GetHidGuid(&HidGuid);
pInfo=SetupDiGetClassDevs(&HidGuid,NULL,NULL,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);
while(!beFind)
{
PSP_DEVINFO_DATA pDevInfo;
SP_DEVICE_INTERFACE_DATA pInterface;
PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail;
pInterface.cbSize=sizeof(SP_DEVICE_INTERFACE_DATA);
SetupDiEnumDeviceInterfaces(pInfo,0,&HidGuid,enumIndex,&pInterface);
if(!SetupDiGetDeviceInterfaceDetail(pInfo,&pInterface,0,0,&need,0))
{
pDetail=(SP_DEVICE_INTERFACE_DETAIL_DATA *)new BYTE[need];
pDetail->cbSize=sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
res=SetupDiGetDeviceInterfaceDetail(pInfo,&pInterface,pDetail,need,NULL,NULL);
int code = GetLastError();
//TRACE(pDetail);
TRACE(pDetail->DevicePath);
TRACE(_T("\n"));
enumStr.Format(_T("%s"),pDetail->DevicePath);
hDl=CreateFile(enumStr,GENERIC_READ|GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
/*if(hDl==INVALID_HANDLE_VALUE)
{
enumIndex++;
delete []pDetail;
Sleep(100);
continue;
}*/

HidD_GetAttributes(hDl,&pAttr);
if((pAttr.ProductID==PID)&&(pAttr.VendorID==VID))
{
HidD_GetPreparsedData(hDl,&pParsendData);
HidP_GetCaps(pParsendData,&hCaps);
InSize = hCaps.InputReportByteLength;
OutSize = hCaps.OutputReportByteLength;
beFind=true;
delete []pDetail;
hDl;
return true;
}
else
{
CloseHandle(hDl);
delete []pDetail;
enumIndex++;
}

}

}

return false;

代码如上, 代码首次运行能准确的找到USB设备。但是当外界将USB设备拔出后,再接入入后。第二次调用该函数时(非工程关闭),该段函数怎么也找不到 需要的hid。但是将exe文件重新启动后,仍然可以找到。那位帮忙找找原因啊!
[解决办法]
http://www.cnblogs.com/shadow2006/archive/2010/07/20/1781195.html

另外HID设备插拔消息是
case(WM_DEVICECHANGE):
if(wParam == DBT_DEVNODES_CHANGED)
{
}

读书人网 >VC/MFC

热点推荐