AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi EndOfFile/EndOfData bei Pipe erkennen
Thema durchsuchen
Ansicht
Themen-Optionen

EndOfFile/EndOfData bei Pipe erkennen

Ein Thema von himitsu · begonnen am 10. Okt 2010 · letzter Beitrag vom 31. Okt 2010
Antwort Antwort
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#1

AW: EndOfFile/EndOfData bei Pipe erkennen

  Alt 11. Okt 2010, 12:42
Dafür ist doch das Overlapped Flag in Readfile da. Daraufhin dann ein WaitForMultipleObjects. Da kannst du dann nach dem Event von ReadFile und ein AbbruchEvent oder Timeout prüfen und das alles im aktuellen Thread.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: EndOfFile/EndOfData bei Pipe erkennen

  Alt 11. Okt 2010, 13:06
@Dezipaitor:
So löse ich das aktuell ja auch, aber dennoch wartet man so erstmal den TimeOut ab, bevor man sagt "nee, da gibt's nix zu holen".

Ich hätte halt gern die Daten nur abgeholt, wenn überhaupt welche da sind,
anstatt 'ne Weile lang zu probieren, ob ich was rausbekomm.


@sparky:
Ja, ich hab schon einige Codes, leider sind die Meisten für's .net oder sie arbeiten "nur" via ReadFile,
welches zwar über BlueSoleil fast hervoragend arbeitet,
aber unter Windows 7 direkt mit dem Windows Bluetooth-Stack eben nicht.

Aber wiiuse klingt dennoch nett, drum schau ich's mir mal an.

Unter Windows sieben nutze muß statt WriteFile MSDN-Library durchsuchenHidD_SetOutputReport genommen werden, welches auch sehr gut funktioniert.
Statt ReadFile müßte MSDN-Library durchsuchenHidD_GetInputReport benutzt werden.
Damit gibt's zwar noch einige Problemchen, aber ReadFile funktioniert da definitiv garnicht.

Im Prinzip würde lieber komplett auf ReadFile/WriteFile verzichten, aber unter XP geht es nicht ohne BlueSoleil und somit muß ReadFile doch mit rein.

HidD_GetInputReport arbeitet jedenfalls nicht blockierend und somit würde ich auch gern das ReadFile direkt mit in dieser Funktion haben, falls HidD_GetInputReport nicht arbeitet.
Via Overlapped arbeitet ReadFile(Ex) zwar nicht blockierend, aber dennoch muß ich eine gewisse Zeit warten bis ich den Lesevorgang abbrech und mir sage "ok, da gibt es nichts zu holen".


Sieht bestimmt sehr chaotisch aus, aber so ist es halt, wenn man vieles ausprobiert.
Delphi-Quellcode:
  Function THIDDevice.Recive(Var Buffer; Len: Integer): Boolean;
    Var W, W2: LongWord;
      O: TOverlapped;
E: LongWord;

    Begin
      FLock.BeginWrite;
      Try
        If not FConnected Then DoConectionError;
WriteLn('* BeginRead');
        Byte(Buffer) := 0;
        Result := HidD_GetInputReport(FPort, @Buffer, Len);
E := GetLastError;
If not Result Then WriteLn('* GetInputReport - error ', E);
        If not Result and (E{GetLastError} in [ERROR_NOT_SUPPORTED, ERROR_CRC]) Then
// Result := ReadFile(FPort, Buffer, Len, W, nil) and (W = Len);
Begin
  ZeroMemory(@O, SizeOf(O));
  O.hEvent := LongWord(Self);
  Result := ReadFileEx(FPort, @Buffer, Len, @O, @DummyReadCompletion)
    and (SleepEx(50, True) = WAIT_IO_COMPLETION)
    and GetOverlappedResult(FPort, O, W, False) and (W = Len);
  If not Result Then CancelIO(FPort);
End;
E := GetLastError;
If not Result Then WriteLn('* ReadFile - error ', E);
WriteLn('* EndRead');
WriteLn;

// Begin
// ZeroMemory(@O, SizeOf(O));
// O.hEvent := LongWord(Self);
// If ReadFile(FPort, Buffer, Len, W, @O) Then Begin
// Result := SleepEx(10, True) = WAIT_IO_COMPLETION;
// If not Result Then CancelIo(FPort);
// End Else Result := False;
// ShowMessage(SysErrorMessage(GetLastError));
// End;
      Finally
        FLock.EndWrite;
      End;
    End;
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (11. Okt 2010 um 13:23 Uhr)
  Mit Zitat antworten Zitat
sparky

Registriert seit: 28. Nov 2004
10 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: EndOfFile/EndOfData bei Pipe erkennen

  Alt 11. Okt 2010, 13:39
@himitsu:
Aus dem Quelltext geht leider nicht hervor wie der an Receive() übergebene Buffer initialisiert ist, vielleicht liegt da die Ursache dafür das nur Windows 7 geht (MSDN: Initializing HID Reports).

Wenn ich Microsoft richtig verstehe, aber wer tut das schon , sollte es jedenfalls auch unter XP mit der Kombination HidD_GetInputReport() und ReadFile() funktionieren (MSDN: Obtaining HID Reports by User-Mode Applications).

BTW welches sind denn die genauen Fehler die unter XP ausgegeben werden wenn man den unter Win7 funktionierendem Code nimmt?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: EndOfFile/EndOfData bei Pipe erkennen

  Alt 11. Okt 2010, 15:04
Da das Senden schonmal zu funktionieren scheint, geh ich mal darauf ein.
(beim Empfangen ist es ähnlich)

HidD_SetOutputReport liefert unter XP+BlueSoleil ERROR_NOT_SUPPORTED zurück.

Initialisiert wurde es recht "einfach".
- erstmal alles mit 0 füllen und dann die nötigen Werte setzen.
- danach dann die benötigten Werte setzen
- und zum Schluß halt noch abseden
Delphi-Quellcode:
Var Report: TWiiReport;

Report.Clear;
Report.ReportID := WII_RID_LED; // setzt Byte[0] - ReportID
Report.Rumble := blRumble in FOutput; // setzt Byte[1] - OutputFlags dieses Reports
Report.LED1 := blLED1 in FOutput; // setzt Byte[1] ...
Report.LED2 := blLED2 in FOutput; // ...
Report.LED3 := blLED3 in FOutput;
Report.LED4 := blLED4 in FOutput;
{THIDDevice.}Send(Report, WIIMOTE_BT_REPORT_LEN);
Ich lade gleich meine aktuellen Codes hoch.

Der selbe Report wird unter XP+Bei Google suchenBlueSoleil nur via WriteFile versendet
und unter Win7 funktioniert nur HidD_GetInputReport.


Dieses RegisterRawInputDevices klingt auch nett ... 'ne Message für die empfangenen Daten würde das Pollen (ständig nachsehn, ob was da ist) und somit dieses ReadFile-Problem obsolete machen.
Aber leider weiß ich nicht, wie man das verwendet, bzw. welche Parameter man übergeben muß.
Das Einzige, was ich mit der Verbindung zur Wii fand, das war http://blogs.yahoo.co.jp/mummykinoi/58265222.html , aber sehr hilfreich isses nicht unbedingt. (nicht daß ich es nicht verstehen würde, aber
mummykinoi weiß es auch nicht)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (11. Okt 2010 um 15:13 Uhr)
  Mit Zitat antworten Zitat
sparky

Registriert seit: 28. Nov 2004
10 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: EndOfFile/EndOfData bei Pipe erkennen

  Alt 12. Okt 2010, 08:35
Zitat:
Das Einzige, was ich mit der Verbindung zur Wii fand, das war http://blogs.yahoo.co.jp/mummykinoi/58265222.html , aber sehr hilfreich isses nicht unbedingt. (nicht daß ich es nicht verstehen würde, aber
mummykinoi weiß es auch nicht)
Öhhh - ja , mein japanisch is nich so toll... aber wenn ich es richtig interpretiere, erwähnt er auch nur, dass es die Funktionen gibt, oder?

Ich versuche gerade über die GetRawInput... Funktionen einen Barcode-Scanner mit HID Interface (Bluetooth/USB) anzubinden.
Allerdings muss ich heute erst noch ein anderes Projekt zur Abgabe bereit machen.
Melde mich nochmal, wenn ich weiss ob das mit der Raw Input Anbindung hinhaut.

Edit:
Zitat:
HidD_SetOutputReport liefert unter XP+BlueSoleil ERROR_NOT_SUPPORTED zurück.
Besteht die Möglichkeit unter XP einen alternativen Bluetooth-Stack zu verwenden (z.B. von Microsoft)?

Geändert von sparky (12. Okt 2010 um 08:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: EndOfFile/EndOfData bei Pipe erkennen

  Alt 12. Okt 2010, 09:06
Er erwähnt, daß er erfahren hat, daß es dieses gibt, und fragt quasi ob/wie man dieses nutzen kann.
Zitat von Sein letzter Satz ist:
Kurz gesagt, überhaupt keinen Fortschritt.

Zitat:
Allerdings muss ich heute erst noch ein anderes Projekt zur Abgabe bereit machen.
Melde mich nochmal, wenn ich weiss ob das mit der Raw Input Anbindung hinhaut.
Keine Sorge, ich hab Zeit, dieses ist "nur" ein Füllprojekt, um mich von anderen Dingen etwas abzulenken (manchmal braucht man von einem anderem Projekt etwas Abstand, um da endlich wieder durchzusehn, weil man so weit drin steckt, daß man den Wald vor lauter Bäumen nicht mehr sieht)

Zitat:
HidD_SetOutputReport liefert unter XP+BlueSoleil ERROR_NOT_SUPPORTED zurück.
Dieses wiiuse arbeitet ähnlich, nut daß es erst WriteFile versucht und das nicht geht auf HidD_SetOutputReport ausweicht.
Sich dabei aber mehrkt, daß es nicht ging und dann beim nächsten Versuch direkt die andere Variante nutzt.
Das werde ich wohl so ähnlich übernehmen.

wiiuse nutzt dieses auch um BlueSoleil und WindowsBTStack zu unterscheiden (WriteFile=BlueSoleil, ansonsten WinBTStack).

Zitat:
Besteht die Möglichkeit unter XP einen alternativen Bluetooth-Stack zu verwenden (z.B. von Microsoft)?
Leider nein, unter WinXP ist der Windows-Bluetooth-Stack hierfür nicht nutzbar.
Der Controler wird einfach nicht verbunden, bzw. die Verbindung bricht nach wenigen Sekunden wieder zusammen/ab.
Da scheint sich erst seit Win7 oder eventuell Vista etwas verbessert zu haben.
Darum wird auch in fast allen Fällen, wo der WiiControler mit dem PC verbunden wird, auf BlueSoleil verwiesen.

Es gibt zwar inzwischen einen Treiber, welchen jemand Anfang des Jahres veröffentlich hat, aber ausprobiert hab ich den noch nicht und wenn wir es unter Win7 über dessen eigenen BTStack hinbekommen, dann ist dieser Treiber auch eher unnötig, vorallem da er eh nur für Win7 existiert.
http://www.codeproject.com/KB/system/wiisensor.aspx


Ach ja, was die Unterstützungen angeht, vom System her hab ich eh nur vor XP+ (notfalls auch erst ab Win7) zu unterstützen.
Älteres wird explizit nicht mehr unterstützt (entweder es läuft oder nicht).
Aktuell hab ich 2 APIs verwendet, welche es erst ab XP gibt.

Also alle Vorschläge für diese Versionen und älteres wird eh "ignoriert"
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (12. Okt 2010 um 09:18 Uhr)
  Mit Zitat antworten Zitat
sparky

Registriert seit: 28. Nov 2004
10 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: EndOfFile/EndOfData bei Pipe erkennen

  Alt 15. Okt 2010, 18:32
Kurzes Update zum Thema Raw Input:

Als wahre Fundgrube hat sich Jan Axelson's Lakeview Research herausgestellt, im Bereich Tools hat er 2 Programme zum Untersuchen von USB-HID Geräten (für die Angabe von UsagePage und Usage der
Top-Level Collection (TLC) zur Geräteauswahl) inkl. Quelltext für Delphi . Ausserdem ein Hinweis auf Robert Marquardt's HID Controller Component Suite für Delphi.

Erfolgsmeldung kommt (hoffentlich) morgen...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz