Delphi-PRAXiS
Seite 1 von 2  1 2      

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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 Uhr.
Seite 1 von 2  1 2      

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