kof_okok
驱动牛犊
驱动牛犊
  • 注册日期2005-05-23
  • 最后登录2005-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:4796回复:8

为什么无法打开一个USB的HID设备?

楼主#
更多 发布于:2005-05-23 10:49
最近做一个USB上位机程序,VB写的,程序挺简单的,如下:
----------------------------------------------------------------------------------------------
Private Sub Form_Load()

Dim HidGuid As Guid
Dim DeviceInterfaceData As Device_Interface_Data
Dim FunctionClassDeviceData As Device_Interface_Detail
Dim ThisHIDdevice As HidD_Attributes
Dim Buffer(100) As Byte
Dim Success As Boolean

Call HidD_GetHidGuid(HidGuid.Data(0))

PnPHandle& = SetupDiGetClassDevs(HidGuid.Data(0), 0, 0, &H12)
DeviceInterfaceData.cbsize = 28
If SetupDiEnumDeviceInterfaces(PnPHandle&, 0, HidGuid.Data(0),
HidDevice&, DeviceInterfaceData.cbsize) Then
FunctionClassDeviceData.cbsize = 5
Success = SetupDiGetDeviceInterfaceDetail(PnPHandle&, DeviceInterfaceData.cbsize, _
FunctionClassDeviceData.cbsize, UBound(FunctionClassDeviceData.DataPath), BytesReturned&, 0)
If (Success = 0) Then ErrorExit (\"Could not find the system name for this HID device\")
HidName$ = \"\": i& = 0:
Do While FunctionClassDeviceData.DataPath(i&) <> 0
HidName$ = HidName$ & Chr(FunctionClassDeviceData.DataPath(i&)): i& = i& + 1: Loop
HidHandle& = CreateFile(HidName$, &HC0000000, 3, 0, 3, 0, 0)
-------------------------------------------------------------------------------------------------
前面一切正常,最后一行出问题,调用CreateFile函数,返回值总是-1
我查看了HidName的数值是:
\\\\?\\hid#vid_413c&pid_3010#6&1b134f9c&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}
这是一个USB鼠标的(HID类设备)的正确的路径,可是调用CreateFile函数却不正确;换用我自己做的HID设备也不正确.不知道为什么?好多天了,卡在这里,请指点指点,谢谢!
我的机器装的是XP,换了一台WINME的,效果一样.我还重新装了VB,也不行.比较郁闷……
对了,CreateFile的声明文件:

Declare Function CreateFile Lib \"kernel32\" Alias \"CreateFileA\" _
(ByVal lpFilename$, ByVal dwDesiredAccess&, ByVal dwShareMode&, lpSecurityAttributes&, _
ByVal dwCreationDisposition&, ByVal dwFlagsAndAttributes&, ByVal hTemplateFile&) As Long


应该也没什么问题吧
别拿豆包不当干粮~
qczhong
驱动牛犊
驱动牛犊
  • 注册日期2004-07-03
  • 最后登录2005-05-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-05-23 11:54
我与您做同样的东东,我是卡在ReadFile地方,您的问题是依次用CreatFile打开hid 设备,但如果您有一个hid 键盘,windows可能找出4个hid设备,但真正能打开的只有2个.您可以把程序前面的设备路径一一送到CreateFile打开就知道那些可打开.也可用bus hound测试.如果还不清楚,请发帖,希望成功后发一份源码给我,我的邮箱:qczhong@sina.com
钟高祥
kof_okok
驱动牛犊
驱动牛犊
  • 注册日期2005-05-23
  • 最后登录2005-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-05-23 13:00
楼上仁兄:
首先感谢您的回帖!谢谢!
我现在不是一下找到很多设备,而是无法打开一个设备。因为用来打开设备的函数createfile的返回值为-1,您知道一个正确的HID句柄的具体数值是多少吗?
我目前写的代码已经都复制到1楼了,我手里有个DEMO,DEMO程序的问题和我的问题一样,(因为我是照着DEMO做的嘛)是无法运行成功的。您要不?
别拿豆包不当干粮~
szyuwei
驱动小牛
驱动小牛
  • 注册日期2002-11-08
  • 最后登录2019-04-08
  • 粉丝0
  • 关注0
  • 积分218分
  • 威望52点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2005-05-23 15:41
你的设备的vid_413c&pid_3010,能确保吗?
有的操作系统是不支持鼠标的这种操作的
QQ:262286607 MSN:szyuwei@msn.com TEL:13316539282
kof_okok
驱动牛犊
驱动牛犊
  • 注册日期2005-05-23
  • 最后登录2005-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-05-23 16:28
to szyuwei :
首先感谢您的回帖!谢谢!
您是说问题出在操作系统是吗?
我不大明白VID和PID的含义(正在查阅相关资料),但我知道我获得的HIDNAME的数值应该是准确的,因为我用另外一个软件也获得了相同的HIDNAME;
另外,我把鼠标去掉,插上自己做的USB下位机HID设备,得到另一个路径:\\\\?\\hid#vid_1241&pid_1301#6&134fa84d&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}
运行VB程序,结果相同:createfile函数返回-1,无法打开HID设备,会是操作系统的问题吗?我的机器装的是XP,可我换过另外一台WINDOWSME的,结果一样啊~
别拿豆包不当干粮~
qczhong
驱动牛犊
驱动牛犊
  • 注册日期2004-07-03
  • 最后登录2005-05-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-05-23 18:17
usb鼠标不能用您的程序打开,我用的是usb键盘。如果您用的是usb键盘,可将CreateFile第二个参数改成GENERIC_WRITE,这样做不对,但至少可打开一个hid 设备,先体会一下,再看我前面写的.
钟高祥
kof_okok
驱动牛犊
驱动牛犊
  • 注册日期2005-05-23
  • 最后登录2005-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-05-25 15:28
qczhong :
哦,原来第二个参数我用的是(GENERIC_READ OR GENERIC_WRITE),而实际上鼠标和键盘只有WRITE的功能,是吧?
不过如您所说,我把参数换成GENERIC_WRITE(&H4000000),如下:HidHandle1& = CreateFile(Hidname1$, &H4000000, 3, 0, 3, 0, 0)
返回值仍然是-1呀~
别拿豆包不当干粮~
wonder_2001
驱动小牛
驱动小牛
  • 注册日期2002-07-02
  • 最后登录2010-12-03
  • 粉丝0
  • 关注0
  • 积分452分
  • 威望96点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-05-26 13:29
应该改成 GENERIC_READ 才对呀!
kof_okok
驱动牛犊
驱动牛犊
  • 注册日期2005-05-23
  • 最后登录2005-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-05-26 13:33
事实上,无论是rend 还是write我都尝试了,但是返回值都是-1,相应的第三个参数我也做了修改,但结果还是不对,你们谁有试过吗?会不会是因为我的操作系统的问题?
别拿豆包不当干粮~
游客

返回顶部