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.