![]() |
JvHidControllerClass unter Windows 10 1809
Ich habe mehrere Microcontroller mit einem einfachen HID-Protokoll ausgestattet um zum Beispiel Konfigurationen oder Bios-Updates darüber zu machen. Seit der letzten Windows 10 Version 1809 funktioniert leider die JVCL HID-Komponente nicht mehr: "Device cannot be opened". Ich nehme an, dass es von der JVCL-Library keine Updates mehr geben wird. Gibt es denn eventuell einen Workaround oder Patch, damit diese Lib unter dem neuen Windows läuft? Oder hat Windows 1809 einen Bug in der hidclass.sys? Leider gibt es im Netz keine konkreten Aussagen hierzu.
Kann jemand helfen? E.R. |
AW: JvHidControllerClass unter Windows 10 1809
Liste der Anhänge anzeigen (Anzahl: 1)
Kann das Problem bestätigen. Ich hab sogar noch ein altes Testprojekt von mir gefunden, das diese Klasse verwendet.
Unter 1809 bekomme ich auch die EControllerError-Exception mit 'Device cannot be opened', sobald OnDeviceChange aufgerufen wird. Ausgelöst wird das in TJvHidDevice.CtlCreate, weil die CreateFile-Aufrufe fehlschlagen. Vielleicht wurden da Rechte in Windows verschärft? Die Version meiner JvHidControllerClass-Unit entspricht diesem Stand: ![]() Anbei noch das Testprojekt zum nachvollziehen. Wäre interessant, wenn jemand das auf älteren Windows 10 Versionen gegentesten könnte: |
AW: JvHidControllerClass unter Windows 10 1809
Auf 1803 läuft das einwandfrei.
Hier wurde das auch schon diskutiert: ![]() Nur wie kann man das auf die JvHidControllerClass übertragen? |
AW: JvHidControllerClass unter Windows 10 1809
Ah, der Workaround lässt sich einfach umsetzen.
Füge die Unit JvHidControllerClass zu deinen Projekt hinzu und ersetze die ursprüngliche TJvHidDevice.CtlCreate mit folgenden Workaround:
Delphi-Quellcode:
Mit der Änderung könntest du natürlich auch die JCL und JVCL neu bauen. Dann spart man sich das Hinzufügen zum Projekt.
constructor TJvHidDevice.CtlCreate(const APnPInfo: TJvHidPnPInfo; const Controller: TJvHidDeviceController);
var LDevicePath: string; // für Workaround begin inherited Create; // initialize private data FMyController := Controller; FIsPluggedIn := True; FIsCheckedOut := False; FIsEnumerated := False; FHidOverlappedRead := INVALID_HANDLE_VALUE; FHidOverlappedWrite := INVALID_HANDLE_VALUE; FVendorName := ''; FProductName := ''; FPreparsedData := nil; SetLength(FPhysicalDescriptor, 0); FSerialNumber := ''; FLanguageStrings := TStringList.Create; FNumInputBuffers := 0; FNumOverlappedBuffers := 0; SetLength(FLinkCollection, 0); FMaxDataListLength := 0; FMaxUsageListLength := 0; FMaxButtonListLength := 0; FReportTypeParam := HIDP_Input; FPollingDelayTime := Controller.DevPollingDelayTime; FThreadSleepTime := Controller.DevThreadSleepTime; FUsagePageParam := 0; FLinkCollectionParam := 0; FUsageParam := 0; FDataThread := nil; OnData := Controller.OnDeviceData; OnUnplug := Controller.OnDeviceUnplug; // https://stackoverflow.com/questions/53761417/createfile-over-usb-hid-device-fails-with-access-denied-5-since-windows-10-180 // Beginn des Workarounds if APnPInfo.DevicePath.EndsWith('\kbd') then begin LDevicePath := APnPInfo.DevicePath.Remove(APnPInfo.DevicePath.IndexOf('\kbd')); end else LDevicePath := APnPInfo.DevicePath; // Ende des Workarounds FHidFileHandle := CreateFile(PChar(LDevicePath), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); FHasReadWriteAccess := HidFileHandle <> INVALID_HANDLE_VALUE; // Win2000 hack if not HasReadWriteAccess then FHidFileHandle := CreateFile(PChar(LDevicePath), 0, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); if HidFileHandle <> INVALID_HANDLE_VALUE then begin FAttributes.Size := SizeOf(THIDDAttributes); if not HidD_GetAttributes(HidFileHandle, FAttributes) then raise EControllerError.CreateRes(@RsEDeviceCannotBeIdentified); end else raise EControllerError.CreateRes(@RsEDeviceCannotBeOpened); FPnPInfo := APnPInfo; // the file is closed to stop using up resources CloseFile; end; |
AW: JvHidControllerClass unter Windows 10 1809
Das war es leider nicht. Aber nach längerem Debuggen habe ich nun die Ursache gefunden.
Es ist genau diese Zeile, die den Fehler verursacht:
Code:
Die Funktion "HidD_GetAttributes" liefert unter 1809 anscheinend immer einen Wert = 0. Wenn man den Rückgabewert einfach ignoriert, funktioniert das Ganze.
if not HidD_GetAttributes(HidFileHandle, FAttributes) then
raise EControllerError.CreateRes(@RsEDeviceCannotBeIdentified);
Code:
HidD_GetAttributes(HidFileHandle, FAttributes);
Grüße aus Berlin, Erwin |
AW: JvHidControllerClass unter Windows 10 1809
Welchen Wert hat denn das Handle, wenn die if-Abfrage fehlschlägt?
|
AW: JvHidControllerClass unter Windows 10 1809
Hallo,
sieht so aus, als ob eure Forschungsbemühungen zu diesem Thema langsam Früchte tragen. Es wäre dann aber auch toll, wenn ihr "asm Ende des Tages" im Mantis Bugtracker des JEDI Projektes ![]() ein Issue anlegt und euren Workaround beschreibt. Dadurch besteht zumindest eine gewisse Chance, dass JEDI aktualisiert wird. Solche Projekte leben schließlich von der Mitarbeit vieler und so ein kleiner Beitrag wäre bestimmt hilfreich! Grüße TurboMagic |
AW: JvHidControllerClass unter Windows 10 1809
Hallo,
habe eben bemerkt, dass ein Bugreport dafür bereits angelegt ist: ![]() Der sollte einfach mit den gefundenen Workarounds auf dem laufenden gehalten werden, dann gibt's auch eine Chance das offiziell reinzubekommen. Grüße TurboMagic |
AW: JvHidControllerClass unter Windows 10 1809
OK, danke für deine Ergänzung im Bugreport.
|
AW: JvHidControllerClass unter Windows 10 1809
Gerne, da nix für.
Frage für mich ist nur, wie bekommen wir geprüft ob euer/eure Lösungsansat/e die sind, die man wirklich so umsetzen sollte (d.h. keine Nebenwirkungen haben) und vor allem wie ist der Prozess, um die Änderungen in JEDI einfließen zu lassen? Hat da jemand Ahnung dazu? Klar kann man das als Notizen im Bugtracker anbringen, aber es ist fraglich wann/wie das dann darüber einfließt. Oder wie kann man sich ansonsten in Jedi einbringen? Ok, gerade das hier gelesen: ![]() Und da klingt es so, als könnte/sollte man dann über die Newsgroups Kontakt aufnehmen. Würde das jemand von euch tun? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz