Hi
Wie die meisten Probleme beginnt es eigentlich ganz harmlos.. mit der Win-API, mit deren Hilfe ich gerne den wahren Namen meiner USB-Maus herausfinden möchte, um diesen dann mit CreateFile(...) zu verwenden. Zuerst hab ich mich mal ein bischen schlau gemacht wie das so geht, und habe auch einige Fortschritte erzielt. Doch jetzt komme ich auch nach stundenlanger Suche nicht weiter. Es gelingt mir zwar, mit SetupDiGetClassDevs und SetupDiGetDeviceRegistryProperty aus der setupapi die USB-Geräte aufzulisten und deren Namen (eigentlich DEVICEDESC) auszugeben, doch sobald ich mit SetupDiEnumDeviceInterfaces die Interfaces dieser Geräte feststellen will, läuft nix mehr. Egal wie ich die Parameter verändere usw. es kommt immer ERROR_NO_MORE_ITEMS. Danke schon mal im Voraus.
Als Betriebssystem nutze ich 64Bit Vista Ultimate.
Ich kopiere die Deklarationen, bei denen ich nicht sicher bin, auch hier hinein, denn ich hab die starke Vermutung dass das Problem entweder irgendwo dort, oder bei der DeviceClassGUID liegt.
Public Declare Function SetupDiEnumDeviceInterfaces Lib "setupapi.dll" ( _
ByVal DeviceInfoSet As Long, _
ByVal DeviceInfoData As SP_DEVINFO_DATA, _
ByVal InterfaceClassGuid As Guid, _
ByVal MemberIndex As Long, _
ByRef DeviceInterfaceData As SP_DEVICE_INTERFACE_DATA) As Long
<StructLayout(LayoutKind.Sequential)> _
Public Structure SP_DEVINFO_DATA
Public cbSize As Long
Public ClassGuid As Guid
Public PropertyID As Long
Public Reserved As Long
End Structure
<StructLayout(LayoutKind.Sequential)> _
Public Structure SP_DEVICE_INTERFACE_DATA
Public cbSize As Integer
Public ClassGuid As Guid
Public PropertyID As Integer
Public Reserved As IntPtr
End Structure
Dim Class_GUID_Mouse As New Guid("50127dc3-0f36-415e-a6cc-4cb3be910b65")
Dim DIDC As SP_DEVINFO_DATA
Dim DIDI As SP_DEVICE_INTERFACE_DATA
Private Sub Form1_MouseClick(...)
hDevInfoC = SetupDiGetClassDevs(Nothing, "USB", Nothing, _
DEVICEFLAGS.DIGCF_PRESENT Or DEVICEFLAGS.DIGCF_ALLCLASSES)
hDevInfoI = SetupDiGetClassDevs(Nothing, Nothing, Nothing, _
DEVICEFLAGS.DIGCF_PRESENT Or DEVICEFLAGS.DIGCF_DEVICEINTERFACE)
DIDC.cbSize = 32 '32Bit: 28 / 64Bit: 32
DIDI.cbSize = 32
For Me.i = 0 To 100
' ---Enumerierung der Geräte---
' *****************************
retValue = SetupDiEnumDeviceInfo(hDevInfoC, i, DIDC)
SE = Err.LastDllError
Select Case SE
Case 0
Debug.Print(i & ": Device enum Ok")
Case ERROR_NO_MORE_ITEMS
Debug.Print(i & ": No Device Found -> exit")
Exit For
Case ERROR_INVALID_USER_BUFFER
Debug.Print(i & ": SP_DEVINFO_DATA Size wrong")
End Select
' ---Überwachung der Geräte mit Debug-Output---
' *********************************************
retValue = SetupDiGetDeviceRegistryProperty(hDevInfoC, DIDC, _
DEVICEPROPERTYINDEX.SPDRP_DEVICEDESC, regtype, _
Nothing, 0, RequiredSize)
SE = Err.LastDllError
If SE = ERROR_INSUFFICIENT_BUFFER Then
Buffer = Space(RequiredSize)
SetupDiGetDeviceRegistryProperty(hDevInfoC, DIDC, _
DEVICEPROPERTYINDEX.SPDRP_DEVICEDESC, regtype, _
Buffer, Len(Buffer), RequiredSize)
Debug.Write(i & ": " & Buffer)
Debug.Print(" ")
End If
' ---Maus suchen---
' *****************
If Buffer.Contains("Microsoft Wheel Mouse Optical (USB)") Then
Buffer = ""
DeviceIndex = i
Exit For
End If
Next i
Debug.Print("-------------------------------------")
For Me.i = 0 To 100
' ---Enumerierung der Interfaces---
' *********************************
retValue = SetupDiEnumDeviceInterfaces(hDevInfoI, Nothing, _
Class_GUID_Mouse, i, DIDI)
SE = Err.LastDllError
Select Case SE
Case 0
Debug.Print(i & ": Interface enum Ok")
Case ERROR_NO_MORE_ITEMS ' <--- HIER lande ich immer
Debug.Print(i & ": No Interface Found -> exit")
Exit For
Case ERROR_INVALID_USER_BUFFER
Debug.Print(i & ": SP_DEVICE_INTERFACE_DATA Size wrong")
End Select
Next
End Sub |