| Navigation:First_Community->Software->Windows Driver | Goto:New Topic•Setting•Search | |
MegaEntry - Social networking and discussion site!
代码就是网络流行的那个VC 与 USB通信的例子程序 但是 我 在SetupDiEnumDeviceInterfaces函数来获取USB设备总是返回失败? void CUSBPortDlg::OnSearch() { // TODO: Add your control notification handler code here m_strLog.Empty(); m_strLog = _T( "正在查找系统中HID类的GUID标识...\r\n "); SetDlgItemText(IDC_EDIT_REPORT,m_strLog); // 查找本系统中HID类的GUID标识 GUID guidHID; HidD_GetHidGuid(&guidHID);CopyRight owned by the original author.--(www.MegaEntry.com)
m_strLog = _T( "HID类的GUID标识为\r\n "); CString strShow; strShow.Format( "x-x-x-x-x-x-x-x-x-x-x\r\n ", guidHID.Data1,guidHID.Data2,guidHID.Data3,guidHID.Data4[0], guidHID.Data4[1],guidHID.Data4[2],guidHID.Data4[3],guidHID.Data4[4], guidHID.Data4[5],guidHID.Data4[6],guidHID.Data4[7]); m_strLog = strShow; SetDlgItemText(IDC_EDIT_REPORT,m_strLog); // 预备查找符合HID规范的USB设备 HDEVINFO hDevInfo = SetupDiGetClassDevs(&guidHID,NULL,NULL, DIGCF_PRESENT ¦ DIGCF_DEVICEINTERFACE); if (hDevInfo == INVALID_HANDLE_VALUE)CopyRight owned by the original author.--(www.MegaEntry.com)
{ AfxMessageBox(_T( "设置安装设备句柄失败! ")); return; } m_strLog = _T( "正在查找可用的USB设备...\r\n "); SetDlgItemText(IDC_EDIT_REPORT,m_strLog); UINT nIndex = 0; // 查找USB设备接口 SP_DEVICE_INTERFACE_DATA strtInterfaceData; BOOL bSuccess; for ( nIndex = 0 ; nIndex < 500000 ; nIndex ){CopyRight owned by the original author.--(www.MegaEntry.com)
/*BOOL */bSuccess = SetupDiEnumDeviceInterfaces(hDevInfo,NULL,&guidHID,nIndex, &strtInterfaceData); //这个函数怎么返回失败,我把我的U盘插上去了啊~ 应该可以找到一个东东撒~ 我循环了500000 还是没有找到,问题就在这儿,希望大伙说说哈 if (bSuccess) { break; } } if (!bSuccess) { AfxMessageBox(_T( "抱歉,未找到可用的USB设备 ")); SetupDiDestroyDeviceInfoList(hDevInfo); return;MegaEntry - Social networking and discussion site!
} // 若找到了设备,则读取设备路径名 SP_DEVICE_INTERFACE_DETAIL_DATA strtDetailData; if (!SetupDiGetDeviceInterfaceDetail(hDevInfo,&strtInterfaceData, &strtDetailData,sizeof(strtDetailData),NULL,NULL)) { AfxMessageBox(_T( "查找设备路径时出错! ")); SetupDiDestroyDeviceInfoList(hDevInfo); return; } // 找到了设备路径 m_strPath = strtDetailData.DevicePath; strShow.Format( "可以通过路径%s访问设备\r\n ",m_strPath); m_strLog = strShow;CopyRight owned by the original author.--(www.MegaEntry.com)
SetDlgItemText(IDC_EDIT_REPORT,m_strLog); // 开放与设备的通信 HANDLE hCom = CreateFile(m_strPath,GENERIC_READ ¦ GENERIC_WRITE, 0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if (hCom = INVALID_HANDLE_VALUE) { AfxMessageBox(_T( "无法打开通信端口 ")); SetupDiDestroyDeviceInfoList(hDevInfo); return; } // 查询设备标识 HIDD_ATTRIBUTES strtAttrib; m_strPath = _T( "正在读取设备的标识...\r\n "); SetDlgItemText(IDC_EDIT_REPORT,m_strPath);CopyRight owned by the original author.--(www.MegaEntry.com)
if (!HidD_GetAttributes(hCom,&strtAttrib)) { AfxMessageBox(_T( "查询设备状态时出错! ")); CloseHandle(hCom); SetupDiDestroyDeviceInfoList(hDevInfo); } // 将有关该设备的标识显示出来 m_strPath = _T( "已读取,见右边所示\r\n "); SetDlgItemText(IDC_EDIT_REPORT,m_strPath); // 显示供给商标识 strShow.Format( "0x%x ",strtAttrib.VendorID); SetDlgItemText(IDC_ID_VENDOR,strShow);MegaEntry - Social networking and discussion site!
// 显示产品标识 strShow.Format( "0x%x ",strtAttrib.ProductID); SetDlgItemText(IDC_ID_PRODUCT,strShow); // 显示产品版本号 strShow.Format( "%d ",strtAttrib.VersionNumber); SetDlgItemText(IDC_ID_VERSION,strShow); // 释放资源 CloseHandle(hCom); SetupDiDestroyDeviceInfoList(hDevInfo); }<网友回复>我试了下 VB的例子 并用 ErrorString = GetErrorString(Err.LastDllError) 打印错误为:没有可用的数据了CopyRight owned by the original author.--(www.MegaEntry.com)
不知道怎么回事 我查了下BAIDU,有很多人碰到同样的问题,上就有同样的问题,但是却没有找到解决的办法,或者是01 02年的帖子 很久了 解决了的也找不到了 希望大家帮忙,先谢谢了 <网友回复>http://www.newasp.net/code/vc/2541.html 这是通信例子的代码下载地址<网友回复>用其他方法跟U盘通讯吧,U盘用HID的方式应该找不到。 http://www.vckbase.com/document/viewdoc/?id=1282参考下<网友回复>非常谢谢楼上~ 查找HID设备还是失败啊 正在查找系统中HID类的GUID标识... HID类的GUID标识为: 4d1e55b2-f16f-11cf-88-cb-00-11-11-00-00-30 找到USB设备.MegaEntry - Social networking and discussion site!
正在查找可用的USB设备... 查找USB设备出错! 总共0个设备连接CopyRight owned by the original author.--(www.MegaEntry.com)
LRESULT CxxxxDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: Add your specialized code here and/or call the base class if(WM_DEVICECHANGE==message) { switch(wParam) { case DBT_DEVICEARRIVAL: MessageBox("设备消息--有新设备可以使用"); break; case DBT_DEVICEREMOVECOMPLETE: MessageBox("设备消息--设备移开不能使用"); break; default: break; }MegaEntry - Social networking and discussion site!
} return CDialog::DefWindowProc(message, wParam, lParam); }