ZHYPDW
驱动牛犊
驱动牛犊
  • 注册日期2003-07-31
  • 最后登录2003-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:5776回复:35

请教USB编程(急!!!)

楼主#
更多 发布于:2003-10-15 17:36
请问以下程序为什么不能查找到可用的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;
}

最新喜欢:

sunmaculasunmac...
berrey
驱动牛犊
驱动牛犊
  • 注册日期2003-08-01
  • 最后登录2004-02-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-12-01 09:23
我也遇到了同样的问题,不同的是我是在SetupDiGetInterfaceDeviceDetail一步会失败,返回的错误代码为1784(ERROR_INVALID_USER_BUFFER),一直没有解决。
为了急于交活,我把这些步骤绕过去了,直接到dosdevices下去读设备名,用来打开文件,也就是相当于符号连接的方法吧
不知道这样会不会有什么潜在的问题,实在没办法呀

哪个大侠解决了这个问题,一定要说一声呀,好多郁闷的人哟!!
lszhou
驱动牛犊
驱动牛犊
  • 注册日期2002-04-28
  • 最后登录2006-02-23
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-11-28 08:39
\'hidsdi.h\'在ddk下,把完整目录写进区
xuqing119
驱动牛犊
驱动牛犊
  • 注册日期2003-11-23
  • 最后登录2003-12-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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.

不知道是怎么回事,请指教????
gehuadongqq
驱动牛犊
驱动牛犊
  • 注册日期2003-03-27
  • 最后登录2004-06-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-11-26 17:25
我也遇到这样的问题了,也刚刚用hid设备做过实验,同样SetupDiEnumDeviceInterfaces返回false,用GetLastError()返回的错误为ERROR_NO_MORE_ITEMS,不知道到底是哪里出了毛病了!希望有人能解决这个问题!
seiko
驱动牛犊
驱动牛犊
  • 注册日期2003-11-17
  • 最后登录2004-03-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-11-26 16:00
你的问题,这段时间我也遇到了,搞的我极郁闷。
刚明白过来。
你的USB设备不是HID设备。
USB的光电鼠是HID设备,插上你的机子,
你这个程序就可以用。



berrey
驱动牛犊
驱动牛犊
  • 注册日期2003-08-01
  • 最后登录2004-02-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-11-25 18:53
我也遇到了同样的问题,求救呀~~~~~~~~
gaohtao
驱动牛犊
驱动牛犊
  • 注册日期2003-10-20
  • 最后登录2004-01-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-11-11 14:15
运行这些HID类函数有一个条件,就是你的设备必须也要定义成HID类设备。看你的程序没有什么毛病,一开始就找不到HID信息的结构数组,说明系统中不存在HID类设备。问题可能就是你的固件程序中的各种描述符没有定义正确,一定要定义成HID类设备,系统才会知道插入的是个HID设备,才会捕捉到这个HID信息的结构数组。
ZHYPDW
驱动牛犊
驱动牛犊
  • 注册日期2003-07-31
  • 最后登录2003-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-10-27 11:05
救命啊!问题还没解决啊,同样的代码,用来检测USB鼠标的话可以检测出来,怎么换成我的USB仪表设备就检测不出来了?
chinasunjava
驱动牛犊
驱动牛犊
  • 注册日期2003-10-23
  • 最后登录2011-10-21
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-10-26 21:46
还是不行啊,问题的根本是什么,
SetupDiEnumDeviceInterfaces无法返回成功,
枚举200也不行。
des,aes,rsa,ecc,pki
yyx_200
禁止发言
禁止发言
  • 注册日期2001-12-24
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72283分
  • 威望361771点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-10-26 20:16
用户被禁言,该主题自动屏蔽!
yyx_200
禁止发言
禁止发言
  • 注册日期2001-12-24
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72283分
  • 威望361771点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-10-26 20:14
用户被禁言,该主题自动屏蔽!
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-10-25 22:24
请问NewTech:我的VC设置有什么问题?该做哪些设置,谢谢!


你可以看看2000ddk下的usbview,那才是你要的!
snowrain
驱动牛犊
驱动牛犊
  • 注册日期2003-07-18
  • 最后登录2005-02-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-10-25 17:55
我也遇到了同样的问题
chinasunjava
驱动牛犊
驱动牛犊
  • 注册日期2003-10-23
  • 最后登录2011-10-21
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-10-25 13:47
高手帮忙解决啊,我也遇到同样的问题!
des,aes,rsa,ecc,pki
yyx_200
禁止发言
禁止发言
  • 注册日期2001-12-24
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72283分
  • 威望361771点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-10-22 10:21
用户被禁言,该主题自动屏蔽!
yyx_200
禁止发言
禁止发言
  • 注册日期2001-12-24
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72283分
  • 威望361771点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-10-22 10:09
用户被禁言,该主题自动屏蔽!
ZHYPDW
驱动牛犊
驱动牛犊
  • 注册日期2003-07-31
  • 最后登录2003-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-10-22 08:47
yyx:
我运行了你的程序,和我的程序的结果一样,还是不能找到可用USB设备。
问题还有待解决,请各位XDJM帮忙一下!谢谢!!!
ZHYPDW
驱动牛犊
驱动牛犊
  • 注册日期2003-07-31
  • 最后登录2003-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-10-21 08:57
谢谢yyx
yyx_200
禁止发言
禁止发言
  • 注册日期2001-12-24
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72283分
  • 威望361771点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2003-10-20 17:47
用户被禁言,该主题自动屏蔽!
上一页
游客

返回顶部