Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.052 Beiträge
 
Delphi 12 Athens
 
#8

AW: wie Hardware (HID) erkennen und via Programm verbinden/trennen?

  Alt 13. Nov 2010, 09:32
Das IOCTL_STORAGE_LOAD_MEDIA, IOCTL_HID_ACTIVATE_DEVICE und IOCTL_HID_DEACTIVATE_DEVICE klingt schonmal gut.
Werd' ich dann mal ausprobieren.
Nja, wenn ich Pech hab, dann sind die für eine Nutzung in 'nem HID Minidriver, welchen ich nicht hab/nutze.

Das dort entdeckte IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER klingt och nett.

OK, danke erstmal und bis nach den Tests.






Zum Suchen hatte ich mir gestern auch dieses hier zusammengebastelt.
Delphi-Quellcode:
Uses JwaBluetoothAPIs;

Var
  RH: HBLUETOOTH_RADIO_FIND;
  RP: BLUETOOTH_FIND_RADIO_PARAMS;
  R: THandle;
  RI: BLUETOOTH_RADIO_INFO;
  DH: HBLUETOOTH_DEVICE_FIND;
  DP: BLUETOOTH_DEVICE_SEARCH_PARAMS;
  DI: BLUETOOTH_DEVICE_INFO;

RP.dwSize := SizeOf(RP);
RH := BluetoothFindFirstRadio(@RP, R);
If RH <> 0 Then Begin
  Repeat
    RI.dwSize := SizeOf(RI);
    If BluetoothGetRadioInfo(R, RI) = ERROR_SUCCESS Then Begin
      ShowMessage(Format('address (%02x:%02x:%02x:%02x:%02x:%02x)'#10 +
        'name "%s"'#10'class %d'#10'subversion %d'#10'manufacturer %d', [
        RI.address.rgBytes[0], RI.address.rgBytes[1], RI.address.rgBytes[2],
        RI.address.rgBytes[3], RI.address.rgBytes[4], RI.address.rgBytes[5],
        RI.szName, RI.ulClassofDevice, RI.lmpSubversion, RI.manufacturer]));
    End Else ShowMessage(SysErrorMessage(GetLastError));

    ZeroMemory(@DP, SizeOf(DP));
    DP.dwSize := SizeOf(DP);
    {DP.fReturnAuthenticated := True;{}
    {DP.fReturnRemembered := True;{}
    {DP.fReturnUnknown := True;{}
    {}DP.fReturnConnected := True;{}
    {DP.fIssueInquiry := True;{}
    DP.hRadio := R;
    DI.dwSize := SizeOf(DI);
    DH := BluetoothFindFirstDevice(DP, DI);
    If DH <> 0 Then Begin
      Repeat
        ShowMessage(Format('address (%02x:%02x:%02x:%02x:%02x:%02x)'#10'class %d'#10 +
          'connected %d'#10'remembered %d'#10'authenticated %d'#10'name "%s"', [
          DI.Address.rgBytes[0], DI.Address.rgBytes[1], DI.Address.rgBytes[2],
          DI.Address.rgBytes[3], DI.Address.rgBytes[4], DI.Address.rgBytes[5],
          DI.ulClassofDevice, Ord(DI.fConnected), Ord(DI.fRemembered),
          Ord(DI.fAuthenticated), DI.szName]));
      Until not BluetoothFindNextDevice(DH, DI);
      BluetoothFindDeviceClose(DH);
    End Else If GetLastError <> ERROR_NO_MORE_ITEMS Then ShowMessage(SysErrorMessage(GetLastError));

    CloseHandle(R);
  Until not BluetoothFindNextRadio(RH, R);
  BluetoothFindRadioClose(RH);
End Else If GetLastError <> ERROR_NO_MORE_ITEMS Then ShowMessage(SysErrorMessage(GetLastError));

ZeroMemory(@DP, SizeOf(DP));
DP.dwSize := SizeOf(DP);
{DP.fReturnAuthenticated := True;{}
{DP.fReturnRemembered := True;{}
{DP.fReturnUnknown := True;{}
{}DP.fReturnConnected := True;{}
{DP.fIssueInquiry := True;{}
//DP.hRadio := 0;
DI.dwSize := SizeOf(DI);
DH := BluetoothFindFirstDevice(DP, DI);
If DH <> 0 Then Begin
  Repeat
    ShowMessage(Format('address (%02x:%02x:%02x:%02x:%02x:%02x)'#10'class %d'#10 +
      'connected %d'#10'remembered %d'#10'authenticated %d'#10'name "%s"', [
      DI.Address.rgBytes[0], DI.Address.rgBytes[1], DI.Address.rgBytes[2],
      DI.Address.rgBytes[3], DI.Address.rgBytes[4], DI.Address.rgBytes[5],
      DI.ulClassofDevice, Ord(DI.fConnected), Ord(DI.fRemembered),
      Ord(DI.fAuthenticated), DI.szName]));
    //if BluetoothRemoveDevice(DI.Address) <> ERROR_SUCCESS then
    // ShowMessage(SysErrorMessage(GetLastError));
  Until Not BluetoothFindNextDevice(DH, DI);
  BluetoothFindDeviceClose(DH);
End Else If GetLastError <> ERROR_NO_MORE_ITEMS Then ShowMessage(SysErrorMessage(GetLastError));
Leider findet das garnichs oder nicht alles.
Jedenfalls schein ich es nicht hinzibekommen das BLUETOOTH_DEVICE_SEARCH_PARAMS (DP) so zu setzen, daß alles gefunden wird.

Weiteres, wie Nachfolgendes, hab ich noch nicht ausprobieren (können).
BluetoothRemoveDevice
BluetoothAuthenticateDevice
BluetoothSetServiceState
BluetoothEnumerateInstalledServices
BluetoothIsConnectable
BluetoothEnableIncomingConnections
BluetoothRegisterForAuthentication
BluetoothUnregisterAuthentication
BluetoothSendAuthenticationResponse


Mein Problem ist auch noch, daß ich es einmal hinbekommen hatte, mein Device zwar aufzulisten, aber eine "Verbindung" zum zugehörigen HID-Control war nicht möglich.
Im Prinzip könnte ich in meiner HID-Komponente noch sowas wie das "address (%02x:%02x:%02x:%02x:%02x:%02x)" benötigen,
denn wenn ich z.B. zwei gleiche Controls angeschlossen hab, dann weiß ich nicht direkt, welches meiner HID-Objekte welchem Control in der Bluetooth-Verwaltung entspricht.



[add]
Wenn ich BluetoothGetRadioInfo direkt auf ein FileHandle zu einem HID-Device loslaß, dann meint es zwar "alles OK" (ERROR_SUCCESS), aber der ganze Record ist nur mit Nullen gefüllt.
Und BluetoothGetDeviceInfo meint dann nur ERROR_NOT_FOUND.
(wär ja auch zu einfach gewesen)



[add]
Hab es nun ganz einfach erstmal mit dem Auswerfen versucht.
Bei IOCTL_HID_DEACTIVATE_DEVICE auf das DeviceHandle "\\?\hid#vid_057e&pid...0030}" angewendet sagt mir DeviceIoControl was von OK/True, aber nichts passiert.
Ich weiß allerdings nicht wie ich was genau als In-Parameter an DeviceIoControl übergeben soll, aber egal was, es bleibt beim True und es hat dennoch keinerlei Auswirkungen (Control bleibt angemeldet und nutzbar).

Wenn das Trennen/Deaktivieren eines verbundenen Gerätes schon nicht funktioniert, dann erspar ich mir die Versuche mit IOCTL_HID_ACTIVATE_DEVICE erstmal.

Auch bei IOCTL_STORAGE_LOAD_MEDIA wird True geliefert und ebenfalls nichts passiert.
(hier natürlich andersrum, also das Gerät befindet sich, laut der Bluetooth-Steuerung, im "Leerlauf" und war/ist noch nicht verbunden)
Wobei ich bei IOCTL_STORAGE_LOAD_MEDIA nicht viel falsch machen kann, da alle Parameter eh nil sind.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (13. Nov 2010 um 11:10 Uhr)
  Mit Zitat antworten Zitat