调用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


希望有经验的朋友可以帮忙看一下,问题出在哪里
...全文
1886 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

16,718

社区成员

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

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