Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi JvHidControllerClass unter Windows 10 1809 (https://www.delphipraxis.net/199904-jvhidcontrollerclass-unter-windows-10-1809-a.html)

er-tronik 28. Feb 2019 20:10

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.

TiGü 1. Mär 2019 09:04

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:
https://github.com/project-jedi/jvcl...ollerClass.pas

Anbei noch das Testprojekt zum nachvollziehen.
Wäre interessant, wenn jemand das auf älteren Windows 10 Versionen gegentesten könnte:

er-tronik 1. Mär 2019 11:33

AW: JvHidControllerClass unter Windows 10 1809
 
Auf 1803 läuft das einwandfrei.

Hier wurde das auch schon diskutiert:
https://stackoverflow.com/questions/...windows-10-180

Nur wie kann man das auf die JvHidControllerClass übertragen?

TiGü 1. Mär 2019 12:23

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:
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;
Mit der Änderung könntest du natürlich auch die JCL und JVCL neu bauen. Dann spart man sich das Hinzufügen zum Projekt.

er-tronik 1. Mär 2019 15:04

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:
if not HidD_GetAttributes(HidFileHandle, FAttributes) then
      raise EControllerError.CreateRes(@RsEDeviceCannotBeIdentified);
Die Funktion "HidD_GetAttributes" liefert unter 1809 anscheinend immer einen Wert = 0. Wenn man den Rückgabewert einfach ignoriert, funktioniert das Ganze.

Code:
HidD_GetAttributes(HidFileHandle, FAttributes);


Grüße aus Berlin,
Erwin

TiGü 1. Mär 2019 21:52

AW: JvHidControllerClass unter Windows 10 1809
 
Welchen Wert hat denn das Handle, wenn die if-Abfrage fehlschlägt?

TurboMagic 2. Mär 2019 09:52

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
http://issuetracker.delphi-jedi.org/my_view_page.php
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

TurboMagic 2. Mär 2019 10:32

AW: JvHidControllerClass unter Windows 10 1809
 
Hallo,

habe eben bemerkt, dass ein Bugreport dafür bereits angelegt ist:
http://issuetracker.delphi-jedi.org/view.php?id=6664

Der sollte einfach mit den gefundenen Workarounds auf dem laufenden gehalten werden, dann gibt's auch eine Chance das offiziell reinzubekommen.

Grüße
TurboMagic

TiGü 2. Mär 2019 11:32

AW: JvHidControllerClass unter Windows 10 1809
 
OK, danke für deine Ergänzung im Bugreport.

TurboMagic 3. Mär 2019 08:10

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:

https://github.com/project-jedi/jvcl

Und da klingt es so, als könnte/sollte man dann über die Newsgroups Kontakt aufnehmen.
Würde das jemand von euch tun?

TiGü 4. Mär 2019 13:18

AW: JvHidControllerClass unter Windows 10 1809
 
Ich denke der Bugtracker reicht. Ggf. löst ein weiteres Update von Windows 10 das Problem auch von alleine.

TurboMagic 4. Mär 2019 22:07

AW: JvHidControllerClass unter Windows 10 1809
 
Ich habe aus einer authorativen Quelle gehört, dass wir einen entsprechenden patch vermutlich am schnellsten ins JEDI bekommen, wenn es einen Git Pull Request gibt der auf den Bugtracker Eintrag verweist...

=> besser nicht auf ein evtl. nie erscheinendes Windows Update warten...

TiGü 5. Mär 2019 13:39

AW: JvHidControllerClass unter Windows 10 1809
 
Ok, erledigt.

TurboMagic 6. Mär 2019 17:26

AW: JvHidControllerClass unter Windows 10 1809
 
Zitat:

Zitat von TiGü (Beitrag 1426990)
Ok, erledigt.

Bedeutet was? Dass du einen Pull Request erstellt hast?
Das wäre gut. Dann könnten wir Stück für Stück solche kleineren Problemchen
in JEDI beheben und es auf Stand halten.

Ich will nämlioch nicht, dass nützliche Bibliotheken vermodern weil jeder
denkt: mach' doch du die nötige Korrektur. ;-)

Grüße
TurboMagick

TiGü 6. Mär 2019 21:46

AW: JvHidControllerClass unter Windows 10 1809
 
Ja, natürlich?! Hätte ich noch verlinken sollen? Ich dachte, es ist klar wie man Pull Requests auf GitHub findet.
https://github.com/project-jedi/jvcl/pull/56

TurboMagic 6. Mär 2019 22:16

AW: JvHidControllerClass unter Windows 10 1809
 
Sorry, aber Git und Pull Requests ist noch neu für mich. Aber danke für's Tun!

Ich war paralell dazu auch nicht ganz unfleissig. Ich hab mal noch einige Texte
der JVCL ins Deutsche Übersetzt. Andreas Hausladen, der lt. Übersichtstabelle
bisher Texte übersetzt kann uns ja denke ich sinnvoller mit Code/Tools usw. helfen.

Habe dazu auch einen Pull Request abgesetzt, Deutsch ist dadurch aber trotzdem
noch nicht zu 100% übersetzt (aber 78% statt 58% ist auch ein Fortschritt), zumal
ich ein paar schwierige Texte von denen ich den Kontext nicht kenne (müsste erst
im Code nachschauen) mal vorerst ausgelassen habe.

wschrabi 11. Okt 2019 16:29

AW: JvHidControllerClass unter Windows 10 1809
 
TAUSEND DANK, der bug ist wirklich doof. Und der Workaround von er-tronik ist grossartig! :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz