ZHYPDW
驱动牛犊
驱动牛犊
  • 注册日期2003-07-31
  • 最后登录2003-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:5773回复: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...
wdy9927
驱动老牛
驱动老牛
  • 注册日期2003-08-04
  • 最后登录2017-02-04
  • 粉丝0
  • 关注0
  • 积分89分
  • 威望143点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2003-10-15 20:24
找不到usb设备是硬件的问题吧~

ZHYPDW
驱动牛犊
驱动牛犊
  • 注册日期2003-07-31
  • 最后登录2003-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-10-16 09:12
但是我在“系统”->“设备管理器”中可以看到USB设备,这应该说明计算机可以识别到USB设备,硬件应该没问题,我用WIN2000 DDK中的USBVerify.exe也可以检测到相应的USB设备信息,请指教是为什么?是不是我上面的程序有问题?谢谢!!!
wdy9927
驱动老牛
驱动老牛
  • 注册日期2003-08-04
  • 最后登录2017-02-04
  • 粉丝0
  • 关注0
  • 积分89分
  • 威望143点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2003-10-16 10:29
不知道。

帮你顶~~~

 :D
clementzhao
驱动大牛
驱动大牛
  • 注册日期2003-05-08
  • 最后登录2009-02-20
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望63点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-10-17 08:45
如果你用busbound看到有启用设备的话,硬件就没问题。光看“设备管理器”不准确。
sprite3
驱动牛犊
驱动牛犊
  • 注册日期2003-10-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-10-17 13:06
me 也想知道

这些代码是不是都是用在hid设备上的?

我用它来检查u盘,没有用

usb存储设备和hid设备的识别有什么不一样吗?
AS_AP
驱动牛犊
驱动牛犊
  • 注册日期2003-08-22
  • 最后登录2011-05-09
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望63点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-10-17 13:22
不看儋料就
sprite3
驱动牛犊
驱动牛犊
  • 注册日期2003-10-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-10-17 13:39
知道是怎么回事吗?

请不吝赐教!
ZHYPDW
驱动牛犊
驱动牛犊
  • 注册日期2003-07-31
  • 最后登录2003-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-10-20 09:03
请各位高人解答一下吧,真的很急。谢谢!!!
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-10-20 10:56
这个只能检测hid类!你的vc的设置有问题!
ZHYPDW
驱动牛犊
驱动牛犊
  • 注册日期2003-07-31
  • 最后登录2003-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-10-20 11:08
请问NewTech:我的VC设置有什么问题?该做哪些设置,谢谢!
yyx_200
禁止发言
禁止发言
  • 注册日期2001-12-24
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72283分
  • 威望361771点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-10-20 15:31
用户被禁言,该主题自动屏蔽!
yyx_200
禁止发言
禁止发言
  • 注册日期2001-12-24
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72283分
  • 威望361771点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-10-20 15:42
用户被禁言,该主题自动屏蔽!
ZHYPDW
驱动牛犊
驱动牛犊
  • 注册日期2003-07-31
  • 最后登录2003-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-10-20 15:45
可以看到“HID类的GUID标识为xxxx”,接下来运行SetupDiGetClassDevs,此时返回的信息是\"重叠I/O操作在进行中\"
再运行SetupDiEnumDeviceInterfaces,此时返回的信息是\"没有可用的数据了\",程序运行到此就结束了,无法找到可用的USB设备。
请各位多多指教,真的很急!!!谢谢
yyx_200
禁止发言
禁止发言
  • 注册日期2001-12-24
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72283分
  • 威望361771点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-10-20 15:57
用户被禁言,该主题自动屏蔽!
ZHYPDW
驱动牛犊
驱动牛犊
  • 注册日期2003-07-31
  • 最后登录2003-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-10-20 16:43
DIGCF_PRESENT|DIGCF_INTERFACEDEVICE; // 控制标志
我用的就是以上的“控制标志”参数啊,我也试了其他参数,结果出来都一样,不知问题出在哪?

[编辑 -  10/20/03 by  ZHYPDW]
yyx_200
禁止发言
禁止发言
  • 注册日期2001-12-24
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72283分
  • 威望361771点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-10-20 17:44
用户被禁言,该主题自动屏蔽!
yyx_200
禁止发言
禁止发言
  • 注册日期2001-12-24
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72283分
  • 威望361771点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-10-20 17:47
用户被禁言,该主题自动屏蔽!
ZHYPDW
驱动牛犊
驱动牛犊
  • 注册日期2003-07-31
  • 最后登录2003-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-10-21 08:57
谢谢yyx
ZHYPDW
驱动牛犊
驱动牛犊
  • 注册日期2003-07-31
  • 最后登录2003-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2003-10-22 08:47
yyx:
我运行了你的程序,和我的程序的结果一样,还是不能找到可用USB设备。
问题还有待解决,请各位XDJM帮忙一下!谢谢!!!
上一页
游客

返回顶部