Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

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

  Alt 23. Okt 2010, 09:24
Ich dreh langsam noch durch.

Aktuell hab ich meinen Code so, über diesen wollte ich auch mit testen, ob das Device verbunden ist.
Delphi-Quellcode:
Case FPortAccess of
  paWriteFile: Begin
    ...
  End;
  paSetOutputReport:
    ...
  Else Begin
    Result := HidD_SetOutputReport(FPort, Report, Len);
    If not Result Then Begin
      ResetEvent(FOverlappt.hEvent);
      If not WriteFile(FPort, Report, FOutputReportSize, W, @FOverlappt) Then Begin
        E := GetLastError;
        If (E = ERROR_HANDLE_EOF) or (E = $048F{ERROR_DEVICE_NOT_CONNECTED}) Then Begin
          DoDisconnect;
          Result := False;
          Exit;
        End;
        W := WaitForSingleObject(FOverlappt.hEvent, FTimeout);
        If (W = WAIT_TIMEOUT) or (W = WAIT_FAILED)
            or not GetOverlappedResult(FPort, FOverlappt, W, False) Then Begin
          CancelIo(FOverlappt.hEvent);
          Result := False;
          Exit;
        End Else FPortAccess := paWriteFile;
      End;
      Result := True;
    End Else FPortAccess := paSetOutputReport;
  End;
End;
Nur liefert WriteFile oftmals direkt True (natürlich ohne einen Fehlercode zu setzen), selbst wenn das Device nicht verbunden ist, sich also nur im Leerlauf befindet.

Vorher hatte ich den Code so,
aber hier lieferte WriteFile auch manchmal direkt True und somit False als Result, auch wenn das Device erfolgreich angesteuert wurde.
Delphi-Quellcode:
Case FPortAccess of
  paWriteFile: Begin
    ...
  End;
  paSetOutputReport:
    ...
  Else Begin
    Result := HidD_SetOutputReport(FPort, Report, Len);
    If not Result Then Begin
      ResetEvent(FOverlappt.hEvent);
      If not WriteFile(FPort, Report, FOutputReportSize, W, @FOverlappt) Then Begin
        E := GetLastError;
        If (E = ERROR_HANDLE_EOF) or (E = $048F{ERROR_DEVICE_NOT_CONNECTED}) Then Begin
          DoDisconnect;
          Result := False;
          Exit;
        End;
        W := WaitForSingleObject(FOverlappt.hEvent, FTimeout);
* If (W = WAIT_TIMEOUT) or (W = WAIT_FAILED)
* or not GetOverlappedResult(FPort, FOverlappt, W, False) Then Begin
* CancelIo(FOverlappt.hEvent);
* Result := False;
* End Else Begin
* FPortAccess := paWriteFile;
* Result := True;
* End;
* End Else Result := False;
    End Else FPortAccess := paSetOutputReport;
  End;
End;

Also WriteFile liefert manchmal True, wenn das Device erfolgreich angesteuert wurde und leider auch dann, wenn es nicht angeschlossen ist und somit garnicht angesteuert wurde.

Somit laß ich jetzt erstmal die obere Variante, aber leider kann ich es so nicht nutzen, um zu erkennen, ob das Device überhaupt verbunden ist.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat