Pipes in Windows

Antworten
mschnell
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

Beitrag von mschnell »

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

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Pipes in Windows

Beitrag von Michl »

mschnell hat geschrieben:Außer den Dateinamen (mit Pfad) vorzugeben, kann ich das Programm nicht beeinflussen.
Du kannst als Dateiname "CON" angeben, dann wird die Ausgabe in die Console geschrieben (https://support.microsoft.com/de-de/kb/74496/en-us).

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; 

baumina
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

Beitrag von baumina »

Ohne zu wissen, ob dir das jetzt weiterhilft oder nicht: In der WinAPI gäbe es da CreateNamedPipe, TransactNamedPipe, ConnectNamedPipe, und vieles mehr.
.

mschnell
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

Beitrag von mschnell »

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

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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

Beitrag von af0815 »

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
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

mschnell
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

Beitrag von mschnell »

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. :D

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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

Beitrag von af0815 »

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).

Socke
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

Beitrag von Socke »

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

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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

Beitrag von af0815 »

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 :shock:
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Pipes in Windows

Beitrag von Warf »

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 :shock:

oder ganu anders rum, das programm dient als server erstellt die Pipe, startet das andere und das benutzt die pipe via Dateidescriptor

marcov
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

Beitrag von marcov »

Nur ein wilder Idee, aber modifizieren des originellen Programm mit DLL injection? Einfach weg der filecreation Call nach user32 abfangen und ein Pipe herstellen?

mschnell
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

Beitrag von mschnell »

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

mschnell
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

Beitrag von mschnell »

af0815 hat geschrieben:[Sein nicht änderbares Programm müsste aber den Server spielen :shock:


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

Antworten