Hallo,
ich habe (unter Windows):
- mit "CreatePipe" eine anonymous pipe eingerichtet
- mit "TTextRec(Textfile_Variable).Handle := Pipe_Handle" das Handle in einer "pascalmäßigen" Datei-Struktur untergebracht
- dann mit "CreateProcess(...)" eine andere .exe gestartet und der das Handle mitgegeben
- die pipe funtioniert so weit korrekt, aber:
Wenn ich die gestartete .exe abschieße bleibt mein Programm hängen wenn es das nächste mal EoF(Textfile_Variable) oder Read(Textfile_Variable, ...) aufruft.
try/except oder {I-}/{$I+}/IOResult helfen mir logischerweise nicht, es tritt ja keine Exception/Laufzeitfehler auf...
In diesem Zusammenhang:
Ctrl-Click auf "EoF" führt mich in systemh.inc - die Implementierung ist dann wohl nicht mehr im Quelltext greifbar? (Bitte um Enschuldigung wenn das eine Anfängerfrage ist).
GetNamedPipeHandleState(TTextRec(Answer).Handle, NIL, NIL, NIL, NIL, NIL, 0) liefert immer Getlasterror = 87 (ERROR_INVALID_PARAMETER), auch wenn die pipe noch funtiopnstüchtig ist. Rufe ich Get mit $irgendeinerZahl statt dem Handle auf bekomme ich dagegen Getlasterror = 6 (ERROR_INVALID_HANDLE) und das obwohl MSDN meint: "hNamedPipe [...] This parameter can also be a handle to an anonymous pipe, as returned by the CreatePipe function."
Irgendjemand schon mal so was in der Art gemacht?
Bei Bedarf könnte ich das ganze auch noch mal zu einenm Minimalprogramm zusammenbauen.
Gruß, Ingo
Programm klemmt bei Aufruf von EoF mit einer broken pipe
-
- Beiträge: 61
- Registriert: Mo 27. Aug 2012, 15:43
-
- Beiträge: 61
- Registriert: Mo 27. Aug 2012, 15:43
Re: Programm klemmt bei Aufruf von EoF mit einer broken pipe
Ergänzung:
Habe das ganze mittlerweile mit "ReadFile" ausprobiert, in der Annahme, ich könnte damit möglicherweise auf der ObejctPascal-Seite vorhandene Probleme umgehen - allerdings klemmt das Program nach dem Aufruf von "ReadFile" genauso wie bei einem Pascal-mäßigen "Read" oder "EoF".
Wenn ich (ohne ObjectPascal/Lazarus-Bezug) im Netz dazu suche behaupten allerdings viele Leute "Readfile" sollte in so einem Fall mit GetlastError = 109 (ERROR_BROKEN_PIPE) beendet werden.
Habe das ganze mittlerweile mit "ReadFile" ausprobiert, in der Annahme, ich könnte damit möglicherweise auf der ObejctPascal-Seite vorhandene Probleme umgehen - allerdings klemmt das Program nach dem Aufruf von "ReadFile" genauso wie bei einem Pascal-mäßigen "Read" oder "EoF".
Wenn ich (ohne ObjectPascal/Lazarus-Bezug) im Netz dazu suche behaupten allerdings viele Leute "Readfile" sollte in so einem Fall mit GetlastError = 109 (ERROR_BROKEN_PIPE) beendet werden.