So, funktioniert:
Code: Alles auswählen
OpenLibrary(0,"hid.dll")
OpenLibrary(1,"setupapi.dll")
HidGuid.GUID
CallFunction(0,"HidD_GetHidGuid",HidGuid)
*DeviceInfoSet=CallFunction(1,"SetupDiGetClassDevsA",HidGuid,0,0,$2|$10)
Structure SP_DEVICE_INTERFACE_DATA
cbSize.l
InterfaceClassGuid.GUID
Flags.l
Reserved.l
EndStructure
Structure SP_DEVICE_INTERFACE_DETAIL_DATA
cbSize.l
DevicePath.b
EndStructure
Structure HIDD_ATTRIBUTES
size.l
VendorID.w
ProductID.w
VersionNumber.w
EndStructure
Structure HIDP_CAPS
Usage.w
UsagePage.w
InputReportByteLength.w
OutputReportByteLength.w
FeatureReportByteLength.w
Reserved.w[17]
NumberLinkCollectionNodes.w
NumberInputButtonCaps.w
NumberInputValueCaps.w
NumberInputDataIndices.w
NumberOutputButtonCaps.w
NumberOutputValueCaps.w
NumberOutputDataIndices.w
NumberFeatureButtonCaps.w
NumberFeatureValueCaps.w
NumberFeatureDataIndices.w
EndStructure
DeviceInterfaceData.SP_DEVICE_INTERFACE_DATA
DeviceInterfaceDetailData.SP_DEVICE_INTERFACE_DETAIL_DATA
DeviceAttributes.HIDD_ATTRIBUTES
DeviceCaps.HIDP_CAPS
MemberIndex.l=0
;Beginn der HID Erkennung
Repeat
DeviceInterfaceData\cbSize=SizeOf(SP_DEVICE_INTERFACE_DATA)
Result.l=CallFunction(1,"SetupDiEnumDeviceInterfaces",*DeviceInfoSet,0,HidGuid,MemberIndex,DeviceInterfaceData)
Debug "InterfaceClassGuid Data1= " + Hex(DeviceInterfaceData\InterfaceClassGuid\Data1)
Debug "InterfaceClassGuid Data2= " + Hex(DeviceInterfaceData\InterfaceClassGuid\Data2)
Debug "InterfaceClassGuid Data3= " + Hex(DeviceInterfaceData\InterfaceClassGuid\Data3)
Debug "Flags= "+Str(DeviceInterfaceData\Flags)
RequiredSize.l
Result.l=CallFunction(1,"SetupDiGetDeviceInterfaceDetailA",*DeviceInfoSet,DeviceInterfaceData,0,0,@RequiredSize,0)
Debug "Erster SetupDiGetDeviceInterfaceDetailA() Aufruf: RequiredSize= "+Str(RequiredSize)
DetailData=RequiredSize
DeviceInterfaceDetailData\cbSize=SizeOf(SP_DEVICE_INTERFACE_DETAIL_DATA)
Dim DetailDataBuffer.b(RequiredSize)
RtlMoveMemory_(@DetailDataBuffer(0),@DeviceInterfaceDetailData\cbSize,4)
CallFunction(1,"SetupDiGetDeviceInterfaceDetailA",*DeviceInfoSet,DeviceInterfaceData,@DetailDataBuffer(0),DetailData,@RequiredSize,0)
DevicePathName.s=PeekS(@DetailDataBuffer(4))
Debug "Gerätpfadname: "+DevicePathName
HidDevice.l=CreateFile_(@DevicePathName,$80000000|$40000000,$1|$2,0,3,0,0)
Debug "HidDevice Handle: "+Str(HidDevice)
DeviceAttributes\Size=SizeOf(HIDD_ATTRIBUTES)
CallFunction(0,"HidD_GetAttributes",HidDevice,DeviceAttributes)
Debug "VendorID: "+Hex(DeviceAttributes\VendorID)
Debug "ProductID: "+Hex(DeviceAttributes\ProductID)
Debug "Versionsnummer: "+Hex(DeviceAttributes\VersionNumber)
MemberIndex=MemberIndex+1
Until Result=0
;Ende der HID Erkennung
;Die Repeat/Until Schleife kann man mit bekannten Vendor-/ProductIDs vergleichen
;um sie bei Erreichen des gesuchten HIDs zu verlassen.
;Das Handle (HidDevice.l) des HIDs wird für andere HidD_xxx Funktionen benötigt.
;Falls die "SetupDiGetDeviceInterfaceDetailA" Funktion Result=0 ausgibt, ist
;kein weiteres HID verfügbar.
;Jetzt ist per WriteFile_() / Read_File_() ein Datentransfer möglich, falls
;man alle Eigenschaften des HID kennt
;falls nicht, weiter ...
;---------------------------------------------------------------------------
;um an weitere Infos des aktuellen HIDs zu kommen ( wie z.B. Hersteller- /
;Produktstring:
;WideChar Konvertierung
;eine andere Lösung fiel mir für den Test nicht ein, vielleicht gibt es
;dafür eine API Funktion ?
Dim StringWide.b(100) ; 100Bytes müßten ausreichen
CallFunction(0,"HidD_GetManufacturerString",HidDevice,@StringWide(0),100)
String.s=""
For a=0 To 50
String.s=String+PeekS(@StringWide(0+(a*2)))
Next
Debug "Manufacturer: "+String
CallFunction(0,"HidD_GetProductString",HidDevice,@StringWide(0),100)
String.s=""
For a=0 To 50
String.s=String+PeekS(@StringWide(0+(a*2)))
Next
Debug "Product: "+String
;weitere nützliche HidD_xxx Funktionen im DDK oder auf der MSDN
;---------------------------------------------------------------------------
;noch mehr HID Infos ( z.B. Länge der Input / Output Reports )
;per HidP_xxx Funktionen:
;"HidD_GetPreparsedData" muss einmalig vor einer oder mehreren
;HidP_xxx Funktion(en) aufgerufen werden
*PreparsedData.l
CallFunction(0,"HidD_GetPreparsedData",HidDevice,@*PreparsedData.l)
CallFunction(0,"HidP_GetCaps",*PreparsedData,DeviceCaps)
Debug "Input Report Länge: "+Str(DeviceCaps\InputReportByteLength)
Debug "Output Report Länge: "+Str(DeviceCaps\OutputReportByteLength)
;weitere nützliche HidP_xxx Funktionen im DDK oder auf der MSDN
;z.B. für Mengen an Infos: HidP_GetValueCaps_()
;---------------------------------------------------------------------------
;Beim Beenden des HID Kommunikation müssen die Ressourcen freigegen werden:
CallFunction(0,"HidD_FreePreparsedData",*PreparsedData)
CallFunction(1,"SetupDiDestroyDeviceInfoList",*DeviceInfoSet)
CloseHandle_(HidDevice)
End
Ich hoffe, daß kein Fehler drinsteckt, weil ich nur einen USB Joystick dranhabe, aber die Schleife müßte funktionieren
( ein Device muss aber eingestöpselt sein, da die Schleife ohne If/EndIf mindestens einmal durchläuft ).
Ist in erster Linie für diejenigen interessant, die ein eigenes HID bauen ( HIDs, wie z.B. Mäuse oder Joysticks werden ja von PB unterstützt ).
An den Datentransfer mit WriteFile_() / ReadFile_() werde ich mich dransetzen, wenn ich es geschafft habe, daß mein USB Interface von Windows als HID erkannt wird.
Vielleicht gibt es hier noch andere USB Bastler? Ich benutze den NationalSemiconductor USBN9603...
Nochmals vielen Dank für die Antworten
PS: Habe vergessen, die beiden Libs zu schließen.