none
调用SetupDiEnumDeviceInterfaces枚举USB设备失败 RRS feed

  • 问题

  • 我最近在做一个操作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
    
    


    希望有经验的朋友可以帮忙看一下,问题出在哪里

    2010年5月21日 1:03

答案

  •   <DllImport("setupapi.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
      Public Shared Function SetupDiEnumDeviceInterfaces( _
          ByVal deviceInfoSet As IntPtr, _
          ByVal deviceInfoData As SP_DEVINFO_DATA, _
          ByRef interfaceClassGuid As Guid, _
          ByVal memberIndex As Integer, _
          ByVal deviceInterfaceData As SP_DEVICE_INTERFACE_DATA _
        ) As Boolean
      End Function

     

     

    • 已标记为答案 米沙 2010年5月24日 3:16
    2010年5月24日 3:16

全部回复

  • 补充

    我通过GetLastError查看后,发现返回是87-无效参数

    我的调用如下

    Dim DevInterfaceData As New SP_DEVICE_INTERFACE_DATA
    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
    
    
    2010年5月21日 8:02
  •   <DllImport("setupapi.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
      Public Shared Function SetupDiEnumDeviceInterfaces( _
          ByVal deviceInfoSet As IntPtr, _
          ByVal deviceInfoData As SP_DEVINFO_DATA, _
          ByRef interfaceClassGuid As Guid, _
          ByVal memberIndex As Integer, _
          ByVal deviceInterfaceData As SP_DEVICE_INTERFACE_DATA _
        ) As Boolean
      End Function

     

     

    • 已标记为答案 米沙 2010年5月24日 3:16
    2010年5月24日 3:16