阅读:5776回复: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-12-01 09:23
我也遇到了同样的问题,不同的是我是在SetupDiGetInterfaceDeviceDetail一步会失败,返回的错误代码为1784(ERROR_INVALID_USER_BUFFER),一直没有解决。
为了急于交活,我把这些步骤绕过去了,直接到dosdevices下去读设备名,用来打开文件,也就是相当于符号连接的方法吧 不知道这样会不会有什么潜在的问题,实在没办法呀 哪个大侠解决了这个问题,一定要说一声呀,好多郁闷的人哟!! |
|
板凳#
发布于:2003-11-28 08:39
\'hidsdi.h\'在ddk下,把完整目录写进区
|
|
地板#
发布于:2003-11-27 13:36
讯问:我把你的代码在vc++下运行,怎么出现以下错误:
D:\\New Folder\\Projects\\新建文件夹\\DisplayHID.cpp(20) : fatal error C1083: Cannot open include file: \'hidsdi.h\': No such file or directory Error executing cl.exe. 不知道是怎么回事,请指教???? |
|
地下室#
发布于:2003-11-26 17:25
我也遇到这样的问题了,也刚刚用hid设备做过实验,同样SetupDiEnumDeviceInterfaces返回false,用GetLastError()返回的错误为ERROR_NO_MORE_ITEMS,不知道到底是哪里出了毛病了!希望有人能解决这个问题!
|
|
5楼#
发布于:2003-11-26 16:00
你的问题,这段时间我也遇到了,搞的我极郁闷。
刚明白过来。 你的USB设备不是HID设备。 USB的光电鼠是HID设备,插上你的机子, 你这个程序就可以用。 |
|
6楼#
发布于:2003-11-25 18:53
我也遇到了同样的问题,求救呀~~~~~~~~
|
|
7楼#
发布于:2003-11-11 14:15
运行这些HID类函数有一个条件,就是你的设备必须也要定义成HID类设备。看你的程序没有什么毛病,一开始就找不到HID信息的结构数组,说明系统中不存在HID类设备。问题可能就是你的固件程序中的各种描述符没有定义正确,一定要定义成HID类设备,系统才会知道插入的是个HID设备,才会捕捉到这个HID信息的结构数组。
|
|
8楼#
发布于:2003-10-27 11:05
救命啊!问题还没解决啊,同样的代码,用来检测USB鼠标的话可以检测出来,怎么换成我的USB仪表设备就检测不出来了?
|
|
9楼#
发布于:2003-10-26 21:46
还是不行啊,问题的根本是什么,
SetupDiEnumDeviceInterfaces无法返回成功, 枚举200也不行。 |
|
|
10楼#
发布于:2003-10-26 20:16
用户被禁言,该主题自动屏蔽! |
|
11楼#
发布于:2003-10-26 20:14
用户被禁言,该主题自动屏蔽! |
|
12楼#
发布于:2003-10-25 22:24
请问NewTech:我的VC设置有什么问题?该做哪些设置,谢谢! 你可以看看2000ddk下的usbview,那才是你要的! |
|
13楼#
发布于:2003-10-25 17:55
我也遇到了同样的问题
|
|
14楼#
发布于:2003-10-25 13:47
高手帮忙解决啊,我也遇到同样的问题!
|
|
|
15楼#
发布于:2003-10-22 10:21
用户被禁言,该主题自动屏蔽! |
|
16楼#
发布于:2003-10-22 10:09
用户被禁言,该主题自动屏蔽! |
|
17楼#
发布于:2003-10-22 08:47
yyx:
我运行了你的程序,和我的程序的结果一样,还是不能找到可用USB设备。 问题还有待解决,请各位XDJM帮忙一下!谢谢!!! |
|
18楼#
发布于:2003-10-21 08:57
谢谢yyx
|
|
19楼#
发布于:2003-10-20 17:47
用户被禁言,该主题自动屏蔽! |
|
上一页
下一页