调用SetupDiEnumDeviceInterfaces枚举USB设备失败

Missa 2010-05-21 10:34:07
我最近在做一个操作USB设备的程序,但在打开设备时遇到了问题.步骤如下,

1.调用SetupDiGetClassDevs.这一部正常获得句柄

2.调用SetupDiEnumDeviceInterfaces,枚举设备.在调用时无论如何返回值也是false.

3.两次调用SetupDiGetDeviceInterfaceDetail,获取设备详细信息,设备名.

4.调用CreateFile,打开设备句柄.

这里3和4因为步骤2不能正确获取信息,而不能进行.

因为这段代码在VC下运行正常,所以我怀疑是我在vb.net下的调用不对.

代码如下

//函数原型

WINSETUPAPI

BOOL

WINAPI

SetupDiEnumDeviceInterfaces(

__in HDEVINFO DeviceInfoSet,

__in_opt PSP_DEVINFO_DATA DeviceInfoData,

__in CONST GUID *InterfaceClassGuid,

__in DWORD MemberIndex,

__out PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData

);



'''vb.net中的调用

<DllImport("setupapi.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _

Public Shared Function SetupDiEnumDeviceInterfaces(ByVal hDevInfo As IntPtr, _

ByVal devInfo As IntPtr, ByRef interfaceClassGuid As Guid, ByVal memberIndex As UInt32, _

ByRef deviceInterfaceData As SP_DEVICE_INTERFACE_DATA) As Boolean

End Function



'''SP_DEVICE_INTERFACE_DATA 结构体

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> Public Class SP_DEVICE_INTERFACE_DATA

Public cbSize As Integer

Public classGuid As Guid

Public devInst As Integer

Public reserved As Integer

End Class


希望有经验的朋友可以帮忙看一下,问题出在哪里
...全文
1687 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuye110 2012-03-19
  • 打赏
  • 举报
回复
怎么解决的,http://hidlibrary.codeplex.com/打不开?
hubeijiaozi 2011-11-02
  • 打赏
  • 举报
回复
据我所知,我GUID有很大的关系,如果你用这个//GUID pGuid={0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b};应该是成功的,
但是后来我换成自已设备的ID的时候就不成功,但是我也想过应该是每个设备的GUID都能通过这种方式打开的吧!了解的高手接着回答!要hold住……
Missa 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xingyuebuyu 的回复:]
C#
http://www.codeproject.com/KB/system/usbeject.aspx


http://social.msdn.microsoft.com/Forums/en/vbgeneral/thread/b772573e-c78d-4032-85eb-7e734ccebaff

http://hidlibrary.codeplex.com/
[/Quote]
感谢xingyuebuyu兄,问题解决.还是我的声明有点问题.参照codeproject上的例子解决.另外有一些奇怪的现象,解释不通:同样的代码,我的程序过不去.把例子的代码复制过来就通过了.然后我执行撤销,返回我原先的代码,也一样通过.
Missa 2010-05-21
  • 打赏
  • 举报
回复
这方面我也考虑过了,现在的声明是从pinvoke.net上找到,应该没太大问题吧.
Forrest23 2010-05-21
  • 打赏
  • 举报
回复
你注意下 vb.net中的参数和 dll中的参数的类型的对应关系 很多情况下是这方面的问题 没做过这方面的帮顶
Missa 2010-05-21
  • 打赏
  • 举报
回复
我用getlasterror查看了一下,返回值是87
systemerror表中表示是无效的参数.
我的调用如下

DevInterfaceData.cbSize = Marshal.SizeOf(DevInterfaceData)

hDevInfo = API.SetupDiGetClassDevs(MyGuid, 0, IntPtr.Zero, DIGCF.DIGCF_PRESENT Or DIGCF.DIGCF_DEVICEINTERFACE)
If hDevInfo.ToInt64 = CLng(INVALID_HANDLE_VALUE) Then
Console.WriteLine("打开失败!")
Exit Sub
End If

While True

Result = API.SetupDiEnumDeviceInterfaces(hDevInfo, Nothing, MyGuid, MemberIndex, DevInterfaceData)

If Result = False Then
Console.WriteLine("枚举失败! : " & Marshal.GetLastWin32Error)
Exit While
End If
MemberIndex += 1
End While
现在USB设备却很多,因此对USB设备的查找与读写就必不可少了。但是能找到关于USB读写的资料很少。这里使用VC++示范了一些获得USB的信息的方法。 一、枚举USB设备   通过枚举USB控制器->枚举此控制器上的USB HUB->枚举HUB的各个端口->获得设备信息。 枚举控制器: wsprintf(HCName, "\\\\.\\HCD%d", HCNum); hHCDev = CreateFile(HCName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);   计算机上的USB主控制器以HCD1,HCD2等命名。通过控制器名称,使用CCreateFile 打开它。使用DeviceIoControl即可得到其驱动程序名,以及与它连接的HUB的名称。用CCreateFile打开HUB,获得连接信息。再枚举HUB的各个端口即可获得连接的设备信息。 二、枚举HID设备   HID设备是微软定义的标准人机接口规范。比如USB鼠标,USB游戏手柄等。不用查找具体设备的GUID,使用API HidD_GetHidGuid(&guidHID)即可得到GUID。有了GUID通过API SetupDiEnumDeviceInterfaces可获得是否有设备连接。如果此类设备连接通过SetupDiGetDeviceInterfaceDetail获得它的设备路径信息。使用CCreateFile 打开它,通过HidD_GetAttributes获得其基本属性信息。使用DeviceIoControl可以获得更详细的属性。在本代码中如果计算机上插有USB游戏手柄,可获得其信息。但不知道为什么xp下却不能获得USB鼠标的信息。 三 枚举U盘   先用GetDriveType API获得设备的类型,若类型为REMOVABLE(当然有些大容量U盘可能报告为FIXED,那就需要其他方法来确定了),即可能是U盘。用CCreateFile 打开之后,再用IOCTL_STORAGE_QUERY_PROPERTY为参数的DeviceIoControl来获得其属性。 四、结束语   示例工程在winxp+xpDDK+VC6下编译通过。USB设备种类比较多,也比较特殊,不同厂商的硬件不同,控制软件也不尽相同(我想主要是ICTL码不同,也不容易查到)。使得访问USB口的设备不象串口并口那么方便。这个例程只是展示了访问的基本方法。其中还有些问题还没有解决,发出来希望大家解决之后能通知我或者发表出来。 参考了USBPort,USBview等代码,一并致谢。

16,549

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧