阅读:5773回复:35
请教USB编程(急!!!)
请问以下程序为什么不能查找到可用的USB设备信息?
开发环境:VC6,win2000sp2,win2000 DDK 程序:查找可用的USB设备信息 extern \"C\" { #include <setupapi.h> #include <hidsdi.h> } //注:已添加setupapi.lib,hid.lib文件到工程里 //以下为程序源码,放在一个按钮的Click事件里 CString m_strPath; CString m_strLog; // BOOL m_bFoundDevice; m_strLog.Empty(); m_strLog = _T(\"正在查找系统中HID类的GUID标识...\"); m_lstInfo.AddString(m_strLog);//m_lstInfo是ListBox控件 // 查找本系统中HID类的GUID标识 GUID guidHID; HidD_GetHidGuid(&guidHID); m_strLog = _T(\"HID类的GUID标识为:\"); m_lstInfo.AddString(m_strLog); m_strLog.Format(\"%08x-%04x-%04x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x\\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.MakeUpper(); m_lstInfo.AddString(m_strLog); HDEVINFO hDevInfo =SetupDiGetClassDevs(&guidHID,NULL,0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); if (hDevInfo == INVALID_HANDLE_VALUE) { m_lstInfo.AddString(\"抱歉,未找到可用设备\"); return; } m_lstInfo.AddString(ErrStr(GetLastError())); //ErrStr是操作完成后返回信息的函数 //此时返回的信息是\"重叠I/O操作在进行中\" UINT nIndex = 0; m_strLog = _T(\"正在查找可用的USB设备...\"); m_lstInfo.AddString(m_strLog); SP_DEVICE_INTERFACE_DATA strtInterfaceData; strtInterfaceData.cbSize =sizeof(SP_DEVICE_INTERFACE_DATA); //for(int i=0;i<8;i++) //{ BOOL bSuccess = SetupDiEnumDeviceInterfaces(hDevInfo,NULL,&guidHID,nIndex, &strtInterfaceData); if (!bSuccess) { m_lstInfo.AddString(ErrStr(GetLastError())); //此时返回的信息是\"没有可用的数据了\", //程序运行到此就结束了,无法找到可用的USB设备 m_strLog = _T(\"抱歉,未找到可用的USB设备\"); m_lstInfo.AddString(m_strLog); //SetupDiDestroyDeviceInfoList(hDevInfo); //return; } else { // 若找到了设备,则读取设备路径名 SP_DEVICE_INTERFACE_DETAIL_DATA strtDetailData; if (!SetupDiGetDeviceInterfaceDetail(hDevInfo,&strtInterfaceData, &strtDetailData,sizeof(strtDetailData),NULL,NULL)) { m_lstInfo.AddString(_T(\"查找设备路径时出错!\")); //SetupDiDestroyDeviceInfoList(hDevInfo); //return; } else { // 找到了设备路径 m_strPath = strtDetailData.DevicePath; m_strLog.Format(\"可以通过路径%s访问设备\",m_strPath); m_lstInfo.AddString(m_strLog); // 开放与设备的通信 HANDLE hCom = CreateFile(m_strPath,GENERIC_READ | GENERIC_WRITE, 0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if (hCom = INVALID_HANDLE_VALUE) { m_lstInfo.AddString(_T(\"无法打开通信端口\")); //SetupDiDestroyDeviceInfoList(hDevInfo); //return; } else { // 查询设备标识 HIDD_ATTRIBUTES strtAttrib; m_strLog = _T(\"正在读取设备的标识...\"); m_lstInfo.AddString(m_strLog); if (!HidD_GetAttributes(hCom,&strtAttrib)) { m_lstInfo.AddString(_T(\"查询设备状态时出错!\")); //CloseHandle(hCom); //SetupDiDestroyDeviceInfoList(hDevInfo); //return; } else { // 将有关该设备的标识显示出来 m_strLog = _T(\"已读取有关该设备的标识:\"); m_lstInfo.AddString(m_strLog); // 显示供应商标识 m_strLog.Format(\"供应商标识:0x%x\",strtAttrib.VendorID); m_lstInfo.AddString(m_strLog); // 显示产品标识 m_strLog.Format(\"产品标识:0x%x\",strtAttrib.ProductID); m_lstInfo.AddString(m_strLog); // 显示产品版本号 m_strLog.Format(\"产品版本号:%d\",strtAttrib.VersionNumber); m_lstInfo.AddString(m_strLog); } } // 释放资源 CloseHandle(hCom); } } SetupDiDestroyDeviceInfoList(hDevInfo); //} //显示操作完成后返回信息的函数代码 CString CUSBCommDlg::ErrStr(DWORD ErrID) { LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, ErrID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL); CString strRet=(LPCTSTR)lpMsgBuf; LocalFree(lpMsgBuf); return strRet; } |
|
最新喜欢:![]() |
沙发#
发布于:2003-10-15 20:24
找不到usb设备是硬件的问题吧~
|
|
板凳#
发布于:2003-10-16 09:12
但是我在“系统”->“设备管理器”中可以看到USB设备,这应该说明计算机可以识别到USB设备,硬件应该没问题,我用WIN2000 DDK中的USBVerify.exe也可以检测到相应的USB设备信息,请指教是为什么?是不是我上面的程序有问题?谢谢!!!
|
|
地板#
发布于:2003-10-16 10:29
不知道。
帮你顶~~~ :D |
|
地下室#
发布于:2003-10-17 08:45
如果你用busbound看到有启用设备的话,硬件就没问题。光看“设备管理器”不准确。
|
|
5楼#
发布于:2003-10-17 13:06
me 也想知道
这些代码是不是都是用在hid设备上的? 我用它来检查u盘,没有用 usb存储设备和hid设备的识别有什么不一样吗? |
|
6楼#
发布于:2003-10-17 13:22
不看儋料就
|
|
7楼#
发布于:2003-10-17 13:39
知道是怎么回事吗?
请不吝赐教! |
|
8楼#
发布于:2003-10-20 09:03
请各位高人解答一下吧,真的很急。谢谢!!!
|
|
9楼#
发布于:2003-10-20 10:56
这个只能检测hid类!你的vc的设置有问题!
|
|
10楼#
发布于:2003-10-20 11:08
请问NewTech:我的VC设置有什么问题?该做哪些设置,谢谢!
|
|
11楼#
发布于:2003-10-20 15:31
用户被禁言,该主题自动屏蔽! |
|
12楼#
发布于:2003-10-20 15:42
用户被禁言,该主题自动屏蔽! |
|
13楼#
发布于:2003-10-20 15:45
可以看到“HID类的GUID标识为xxxx”,接下来运行SetupDiGetClassDevs,此时返回的信息是\"重叠I/O操作在进行中\"
再运行SetupDiEnumDeviceInterfaces,此时返回的信息是\"没有可用的数据了\",程序运行到此就结束了,无法找到可用的USB设备。 请各位多多指教,真的很急!!!谢谢 |
|
14楼#
发布于:2003-10-20 15:57
用户被禁言,该主题自动屏蔽! |
|
15楼#
发布于:2003-10-20 16:43
DIGCF_PRESENT|DIGCF_INTERFACEDEVICE; // 控制标志
我用的就是以上的“控制标志”参数啊,我也试了其他参数,结果出来都一样,不知问题出在哪? [编辑 - 10/20/03 by ZHYPDW] |
|
16楼#
发布于:2003-10-20 17:44
用户被禁言,该主题自动屏蔽! |
|
17楼#
发布于:2003-10-20 17:47
用户被禁言,该主题自动屏蔽! |
|
18楼#
发布于:2003-10-21 08:57
谢谢yyx
|
|
19楼#
发布于:2003-10-22 08:47
yyx:
我运行了你的程序,和我的程序的结果一样,还是不能找到可用USB设备。 问题还有待解决,请各位XDJM帮忙一下!谢谢!!! |
|
上一页
下一页