Pipes in Windows

Pipes in Windows

Beitragvon mschnell » 2. Jul 2015, 15:17 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
mschnell
 
Beiträge: 3158
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

Beitragvon Michl » 3. Jul 2015, 00:18 Re: Pipes in Windows

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; 
Michl
 
Beiträge: 2169
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon baumina » 3. Jul 2015, 06:35 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.
.
baumina
 
Beiträge: 152
Registriert: 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon mschnell » 3. Jul 2015, 12:11 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
mschnell
 
Beiträge: 3158
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

Beitragvon af0815 » 3. Jul 2015, 14:03 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
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
af0815
 
Beiträge: 3258
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: Win7/Linux (L stable FPC stable) per fpcup | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon mschnell » 3. Jul 2015, 14:13 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. :D
mschnell
 
Beiträge: 3158
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

Beitragvon af0815 » 3. Jul 2015, 15:31 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).
af0815
 
Beiträge: 3258
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: Win7/Linux (L stable FPC stable) per fpcup | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon Socke » 4. Jul 2015, 08:01 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
Socke
 
Beiträge: 2387
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 8.1/Debian GNU/Linux/Raspbian | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon af0815 » 4. Jul 2015, 15:12 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 :shock:
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
af0815
 
Beiträge: 3258
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: Win7/Linux (L stable FPC stable) per fpcup | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon Warf » 4. Jul 2015, 19:48 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 :shock:

oder ganu anders rum, das programm dient als server erstellt die Pipe, startet das andere und das benutzt die pipe via Dateidescriptor
Warf
 
Beiträge: 616
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon marcov » 5. Jul 2015, 13:14 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?
marcov
 
Beiträge: 999
Registriert: 5. Aug 2008, 08:37
Wohnort: Eindhoven (Niederlande)
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk) | 
CPU-Target: 32/64,PPC(+64), ARM
Nach oben

Beitragvon mschnell » 6. Jul 2015, 11:50 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
mschnell
 
Beiträge: 3158
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

Beitragvon mschnell » 6. Jul 2015, 11:55 Re: Pipes in Windows

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
mschnell
 
Beiträge: 3158
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

• Themenende •

Zurück zu Windows



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried