Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

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

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

  Alt 23. Okt 2010, 08: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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat