Pipes in Windows
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Pipes in Windows
Hi Windows Experten.
Ich habe ein 3rd Party Programm, das regelmäßig Daten in eine Datei schreibt. Außer den Dateinamen (mit Pfad) vorzugeben, kann ich das Programm nicht beeinflussen. Das Programm läuft nach dem Start vor sich hin bis man es beendet und schreibt immer weiter.
Nun möchte ich die geschriebenen Daten in Realtime mit einem eigenen Programm weiterverarbeiten.
In Linux wäre das kein Problem. Man mache eben eine Pipe im Dateisystem, die beide Programme mit normaler Datei-I/O verwenden.
Wie könnte sowas in Windows gehen ? (Named Pipe genau so wie eine Datei öffnen .... ???)
Gruß,
-Michael
Ich habe ein 3rd Party Programm, das regelmäßig Daten in eine Datei schreibt. Außer den Dateinamen (mit Pfad) vorzugeben, kann ich das Programm nicht beeinflussen. Das Programm läuft nach dem Start vor sich hin bis man es beendet und schreibt immer weiter.
Nun möchte ich die geschriebenen Daten in Realtime mit einem eigenen Programm weiterverarbeiten.
In Linux wäre das kein Problem. Man mache eben eine Pipe im Dateisystem, die beide Programme mit normaler Datei-I/O verwenden.
Wie könnte sowas in Windows gehen ? (Named Pipe genau so wie eine Datei öffnen .... ???)
Gruß,
-Michael
Re: Pipes in Windows
Du kannst als Dateiname "CON" angeben, dann wird die Ausgabe in die Console geschrieben (https://support.microsoft.com/de-de/kb/74496/en-us).mschnell hat geschrieben:Außer den Dateinamen (mit Pfad) vorzugeben, kann ich das Programm nicht beeinflussen.
Ich dachte, dass man dann einfach in einem Thread per TProcess und [poUsePipes) diese Ausgabe abfangen kann, geht aber nicht, da scheinbar die Umleitung zur Console tatsächlich dann auch die Console braucht (zumindest bekomme ich eine Fehlermeldung, evtl. hast du da ja mehr Erfolg?!).
Auf die Schnelle würde mir noch einfallen das Programm per TProcess zu starten, es z.B. eine Sekunde laufen zu lassen, das Programm killen, die Datei auslesen und das Programm wieder starten (notfalls könnte man auch ein zweiten TProcess starten, während die eine Datei geladen wird, sodaß die Unterbrechnung möglichst kurz bleibt). Das ist aber ein ziemliches Gewurstel.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 152
- Registriert: Mo 3. Feb 2014, 14:07
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
Re: Pipes in Windows
Ohne zu wissen, ob dir das jetzt weiterhilft oder nicht: In der WinAPI gäbe es da CreateNamedPipe, TransactNamedPipe, ConnectNamedPipe, und vieles mehr.
.
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Pipes in Windows
Da ich das Programm nicht stoppen kann und es auch nicht dazu bringen kann, eine von mit vorgegebene WinAPI funktion aufzurufen, hilft das leider alles nichts.
Die Frage war ob man (wie in Linux) auch in Windows eine Pipe wie eine Datei mit einem gefaketen "Datei"namen mit der normalen Datei-API öffenen und beschreiben kann.
-Michael
Die Frage war ob man (wie in Linux) auch in Windows eine Pipe wie eine Datei mit einem gefaketen "Datei"namen mit der normalen Datei-API öffenen und beschreiben kann.
-Michael
- af0815
- Lazarusforum e. V.
- Beiträge: 6209
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Pipes in Windows
Unter Windows, laut meinen Erfahrungen (und der Windows APIdoku) nein. Die Pipes sind als eigenständige Einheiten getrennt von Dateisystem implementiert. Funktionieren aber ähnlich (Blocking/non blocking/ rechte /....).
Du kannst maximal auf Systemdevices wie CON: umleiten und das probieren innerhalb von TProcess abzufangen. Ev. mit den Unixtools das umleiten.
Andreas
Du kannst maximal auf Systemdevices wie CON: umleiten und das probieren innerhalb von TProcess abzufangen. Ev. mit den Unixtools das umleiten.
Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Pipes in Windows
Windows hat (genau wie Linux) sowohl das generelle Konzept von Named Pipes wie auch das von TCP/IP Sockets von Unix geerbt. Leider ist beides offensichtlich in Windows wesentlich schlechter implementiert als in Linux.
-Michael
P.S.: Für das Problem die Realtime-Daten aus dem besagten Programm herauszubekommen haben wir zum Glück eine andere Schnittstelle des Programms verwenden können.
-Michael
P.S.: Für das Problem die Realtime-Daten aus dem besagten Programm herauszubekommen haben wir zum Glück eine andere Schnittstelle des Programms verwenden können.
- af0815
- Lazarusforum e. V.
- Beiträge: 6209
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Pipes in Windows
mschnell hat geschrieben:Windows hat (genau wie Linux) sowohl das generelle Konzept von Named Pipes wie auch das von TCP/IP Sockets von Unix geerbt. Leider ist beides offensichtlich in Windows wesentlich schlechter implementiert als in Linux.
Ich würde sagen, nicht schlechter, sonders komplett anders.
Man kann mit den Pipes einiges anstellen, das sogar mit Domainsicherheit, allerdings NICHT auf der Shell. Ich habe damit Datenübertragung von Meßeinrichtungen zwischen Fernost und Österreich lange Zeit betrieben. Für Pipeserver hat man die Pro Variante von Windows benötigt. Schon alleine deswegen weil die kleinen Versionen nicht auf die Domainsicherheit richtig zugreifen können.
Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Lazarusforum e. V.
- Beiträge: 3158
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Pipes in Windows
mschnell hat geschrieben:Da ich das Programm nicht stoppen kann und es auch nicht dazu bringen kann, eine von mit vorgegebene WinAPI funktion aufzurufen, hilft das leider alles nichts.
Die Frage war ob man (wie in Linux) auch in Windows eine Pipe wie eine Datei mit einem gefaketen "Datei"namen mit der normalen Datei-API öffenen und beschreiben kann.
Laut der offiziellen Doku https://msdn.microsoft.com/en-us/librar ... 85%29.aspx verwendet man auf der Client-Seite die ganz normale Datei-API.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
- af0815
- Lazarusforum e. V.
- Beiträge: 6209
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Pipes in Windows
Socke hat geschrieben:Laut der offiziellen Doku https://msdn.microsoft.com/en-us/librar ... 85%29.aspx verwendet man auf der Client-Seite die ganz normale Datei-API.
Sein nicht änderbares Programm müsste aber den Server spielen
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 1910
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Pipes in Windows
af0815 hat geschrieben:Socke hat geschrieben:Laut der offiziellen Doku https://msdn.microsoft.com/en-us/librar ... 85%29.aspx verwendet man auf der Client-Seite die ganz normale Datei-API.
Sein nicht änderbares Programm müsste aber den Server spielen
oder ganu anders rum, das programm dient als server erstellt die Pipe, startet das andere und das benutzt die pipe via Dateidescriptor
-
- Beiträge: 1100
- Registriert: Di 5. Aug 2008, 09:37
- OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
- CPU-Target: 32/64,PPC(+64), ARM
- Wohnort: Eindhoven (Niederlande)
Re: Pipes in Windows
Nur ein wilder Idee, aber modifizieren des originellen Programm mit DLL injection? Einfach weg der filecreation Call nach user32 abfangen und ein Pipe herstellen?
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Pipes in Windows
Socke hat geschrieben:Laut der offiziellen Doku https://msdn.microsoft.com/en-us/librar ... 85%29.aspx verwendet man auf der Client-Seite die ganz normale Datei-API.
Super !
Danke. Vielleicht versuchen wir es dann doch noch auf diese Weise.
-Michael
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Pipes in Windows
af0815 hat geschrieben:[Sein nicht änderbares Programm müsste aber den Server spielen
Nö.
Unser (Pascal) Programm kann zuerst gestartet werden (vielleicht sogar als Dient). Es definiert die named Pipe.
Das andere Programm soll nur in diese Pipe schreiben. Da es in eine Datei schreiben will, wird es (falls die Datei nicht existiert) eine Kreieren und dann reinschreiben.
Wenn ich die Doku richtig verstanden habe, müsste ich dem Programm dann einen Dateinamen wie "\\\\.\\pipe\\mynamedpipe" vorgeben und es könte klappen.
Gruß und Dank,
-Michael