CString szTemp;
OVERLAPPED ReadOverlapped;
char ReadReportBuffer[1024];
CComboBox* pCombo = (CComboBox*)GetDlgItem(IDC_COMBO_SEARCH);
/*************************************************************************************/
/* Get GUID for all System HIDs----获取guid /
HidD_GetHidGuid(&HidGuid);
/ Get Device Information for all present devices ---获取设备信息群*/
DevInfo = SetupDiGetClassDevs(&HidGuid, NULL,NULL, (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE) );
if( INVALID_HANDLE_VALUE == DevInfo)
{
AfxMessageBox("DevInfo出错,退出");
return ;
}
DevData.cbSize = sizeof(DevData);
DevDetail = NULL;
Index = -1;
/* Scan all Devices */
do {
Index++;
/* Device Interface Element of a Device Information set */
ok = SetupDiEnumDeviceInterfaces(DevInfo,0, &HidGuid,Index, &DevData);
if (ok == FALSE)
{
AfxMessageBox("退出");
break;
}
/* Get Device Interface Details - Get Length */
ok = SetupDiGetDeviceInterfaceDetail(DevInfo, &DevData, NULL, 0, &Length, NULL );
/* Allocate memory for Device Detailed Data---分配内存 */
DevDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA) malloc(Length);
/* Set cbSize in the DevDetail structure */
DevDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
/* Get Device Interface Details --真正的获取接口*/
ok = SetupDiGetDeviceInterfaceDetail(DevInfo,&DevData,DevDetail, Length, NULL, NULL );
if (!ok)
{
free(DevDetail);
DevDetail = NULL;
continue;
}
nDevDetail[Index] = (int)DevDetail;
//free(DevDetail); //及时释放内存
/*********开始建立连接*************/
/* Create File for Device Read/Write */
DevHandle = CreateFile(DevDetail->DevicePath,NULL,FILE_SHARE_READ | FILE_SHARE_WRITE,(LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (DevHandle == INVALID_HANDLE_VALUE)
{
free(DevDetail);
DevDetail = NULL;
continue;
}
/********************获取属性信息,包括pid vid */
DevAttributes.Size = sizeof(DevAttributes);
ok = HidD_GetAttributes(DevHandle,&DevAttributes);
if(!ok)
{
free(DevDetail);
CloseHandle(DevHandle);
DevDetail = NULL;
continue;
}
if((DevAttributes.VendorID == 0x10c4 )&&(DevAttributes.ProductID == 0x8296 )) //DevDetail->DevicePath MyDevPathName
{
MyDevPathName = DevDetail->DevicePath;
DevHandle=CreateFile(DevDetail->DevicePath, GENERIC_READ , FILE_SHARE_READ|FILE_SHARE_WRITE, (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
if( (DevHandle == INVALID_HANDLE_VALUE )&&(DevHandle == 0) )
{
AfxMessageBox("读访问打开设备失败");
return;
}
Sleep(1000);
}
szTemp.Format("VID--%x PID--%x",DevAttributes.VendorID,DevAttributes.ProductID);
pCombo ->AddString(szTemp);
DevCount++;
/*************************************************************************************/
} while(DevCount < 20);
pCombo ->SetCurSel(0);
void CUsb_hidDlg::OnTimer(UINT nIDEvent)
{
CString szTemp,sztr1;
LPVOID ReadReportBuffer1[1024];
OVERLAPPED ReadOverlapped1;
static int a =0;
// TODO: Add your message handler code here and/or call default
switch( nIDEvent )
{
case 1:
a++;
DevHandle=CreateFile(MyDevPathName, GENERIC_READ , FILE_SHARE_READ|FILE_SHARE_WRITE, (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
if( DevHandle != INVALID_HANDLE_VALUE )
{
ok =ReadFile(DevHandle,ReadReportBuffer1,5,NULL,&ReadOverlapped1);
if(!ok)
{
int mm = GetLastError();
sztr1.Format(" %d Cannot Read Data... 读出失败 %d",a,mm);
GetDlgItemText(IDC_EDIT_MESSAGE,szTemp);
szTemp+=sztr1+"\r\n";
SetDlgItemText(IDC_EDIT_MESSAGE,szTemp);
CloseHandle(DevHandle);
DevDetail = NULL;
}
else
{
sztr1.Format("%d %s",a,ReadReportBuffer1);
GetDlgItemText(IDC_EDIT_MESSAGE,szTemp);
szTemp+=sztr1+"\r\n";
SetDlgItemText(IDC_EDIT_MESSAGE,szTemp);
}
}
break;
default:
break;
}
CDialog::OnTimer(nIDEvent);
}
6 句柄无效,查看你是否正确打开设备
试试看
http://tianshawuming.blog.163.com/blog/static/17088824320115965418566/
用这个调试工具先调试下。