Verständnisfrage zu ConnectNamedPipe_()

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Verständnisfrage zu ConnectNamedPipe_()

Beitrag von Kurzer »

Hallo,

für ein kleines Tool arbeite ich mich gerade in die Thematik der NamedPipes ein. Dazu habe ich mir zum Verstehen des ganzen ein Beispiel hier aus dem Forum genommen - siehe Sourcecode unten.

Was ich nicht verstehe ist, dass das Schreiben und Lesen in/aus der Pipe auch funktioniert, wenn man die Zeile 14 weglässt "ConnectNamedPipe_(hPipe, 0)".
So wie ich das verstanden habe, ist diese Funktion dafür da den Server an seiner zuvor erzeugten Pipe anzumelden. Warum Funktioniert das ganze auch ohne diese Anmeldung?

Kennt sich da jemand genauer mit aus?

Gruß Kurzer

Code: Alles auswählen

; Beispielprogramm für Named Pipes (very quick, very dirty ...)
; stbi 2007

#BUFSIZE = 1024 
PipeName.s = "\\.\pipe\pbsamplepipe"

; Named Pipe einrichten
hPipe.l = CreateNamedPipe_(PipeName, #PIPE_ACCESS_DUPLEX, #PIPE_TYPE_BYTE | #PIPE_READMODE_BYTE | #PIPE_NOWAIT, #PIPE_UNLIMITED_INSTANCES, #BUFSIZE, #BUFSIZE, 0, #Null) 
If hPipe = 0
  Debug "Fehler beim Erstellen der Named Pipe" : End 
EndIf 

; zur Named Pipe verbinden
ConnectNamedPipe_(hPipe, 0)

; in die Pipe schreiben
handle.l = OpenFile(#PB_Any, PipeName)
WriteString(handle, "Hello Pipe!")
CloseFile(handle)

; einen Blick in die Pipe werfen
BytesAvailable.l = 0
PeekNamedPipe_(hPipe, 0, 0, 0, @BytesAvailable, 0)

; aus der Pipe lesen
Buffer.s = Space(BytesAvailable) 
BytesRead.l = 0 
ReadFile_(hPipe, @Buffer, BytesAvailable, @BytesRead, 0)
Debug Buffer

; aufräumen
DisconnectNamedPipe_(hPipe)
CloseHandle_(hPipe)

End
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2023: 56 Jahre.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Verständnisfrage zu ConnectNamedPipe_()

Beitrag von ts-soft »

Da Du die NamedPipe gerade erst erstellt hast, biste auch noch verbunden, somit ist ConnectNamedPipe überflüssig.
Es kann aber nicht schaden, es vorsichtshalber auszuführen!

Ansonsten habe ich das Beispiel mal in Hinsicht auf 64-Bit und Unicode erweitert, weil sonst kannst Du es spätestens ab
PB 5.50 nicht mehr nutzen :mrgreen:

Code: Alles auswählen

EnableExplicit
; Beispielprogramm für Named Pipes (very quick, very dirty ...)
; stbi 2007

#BUFSIZE = 1024
Define PipeName.s = "\\.\pipe\pbsamplepipe"

; Named Pipe einrichten
Define hPipe.i = CreateNamedPipe_(PipeName, #PIPE_ACCESS_DUPLEX, #PIPE_TYPE_BYTE | #PIPE_READMODE_BYTE | #PIPE_NOWAIT, #PIPE_UNLIMITED_INSTANCES, #BUFSIZE, #BUFSIZE, 0, #Null)
If hPipe = 0
  Debug "Fehler beim Erstellen der Named Pipe" : End
EndIf

; zur Named Pipe verbinden
ConnectNamedPipe_(hPipe, 0)

; in die Pipe schreiben
Define handle.i = OpenFile(#PB_Any, PipeName)
WriteString(handle, "Hello Pipe!", #PB_Ascii)
CloseFile(handle)

; einen Blick in die Pipe werfen
Define BytesAvailable.l = 0
PeekNamedPipe_(hPipe, 0, 0, 0, @BytesAvailable, 0)

; aus der Pipe lesen
Define Buffer.s = Space(BytesAvailable)
Define BytesRead.l = 0
ReadFile_(hPipe, @Buffer, BytesAvailable, @BytesRead, 0)
Debug PeekS(@Buffer, -1, #PB_Ascii)

; aufräumen
DisconnectNamedPipe_(hPipe)
CloseHandle_(hPipe)

End
Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Verständnisfrage zu ConnectNamedPipe_()

Beitrag von Kurzer »

Danke für deine Rückmeldung und das Überarbeiten. :allright:

Wenn ich das richtig sehe, sind das...
- #PB_Ascii beim schreiben und peeken
- Integer für handles
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2023: 56 Jahre.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Verständnisfrage zu ConnectNamedPipe_()

Beitrag von ts-soft »

Kurzer hat geschrieben:Wenn ich das richtig sehe, sind das...
- #PB_Ascii beim schreiben und peeken
- Integer für handles
Genau :allright:
CreateNamedPipe_() übergibt den Namen schon korrekt (interne Umwandlung nach CreateNamedPipe/A/W)

und das wichtigste, EnableExplicit!
aber das wird immer wieder ignoriert :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Verständnisfrage zu ConnectNamedPipe_()

Beitrag von Kurzer »

ts-soft hat geschrieben: und das wichtigste, EnableExplicit!
aber das wird immer wieder ignoriert :mrgreen:
Korrekt, aber nicht von mir - *hüstel* EnableExplicit ist mein zweiter Vorname. :lol:
Ich habe den Testcode hier einfach 1 zu 1 rein geworfen, wie ich ihn im Forum vorgefunden habe.
Meine Routinen, die ich daraus erstelle, werden als Module erstellt... und die fangen genau so an:

Code: Alles auswählen

Module NamedPipes
	EnableExplicit
	
	;*************************************************************************
	;* Global Constants
	;*************************************************************************

	#MAXPIPES = 10
	#BUFFERSIZE = 1024
	#DEFAULTTIMEOUT = 0

[...]
:wink:
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2023: 56 Jahre.
NeoChris
Beiträge: 205
Registriert: 21.11.2013 21:17
Wohnort: Schweiz
Kontaktdaten:

Re: Verständnisfrage zu ConnectNamedPipe_()

Beitrag von NeoChris »

Kurzer hat geschrieben:

Code: Alles auswählen

;*************************************************************************
	;* Global Constants
	;*************************************************************************
Gibts den auch nicht globale Constanten :?:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Verständnisfrage zu ConnectNamedPipe_()

Beitrag von ts-soft »

Jein. Die Konstanten in einem Modul sind nur Modul-Global. Diese können exportiert (DeclareModule) werden oder eben nicht.

Aber ich weiß schon was Du meinst :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Verständnisfrage zu ConnectNamedPipe_()

Beitrag von Kurzer »

NeoChris hat geschrieben: Gibts den auch nicht globale Constanten :?:
Berechtigte Frage, die Antwort hat ts-soft ja schon gegeben.
Ehrlich gesagt, habe ich mir bei den Konstanten da keine Gedanken gemacht. Ich habe die Abschnittsbeschreibung in dem Fall einfach genau so gestaltet, wie bei den anderen Abschnitten auch (also Variablen, Strukturen, Prozeduren usw). Eben inkl. der Eigenschaft bzw. des Scopes, daher in dem Fall das "Global" davor. Das hatte ich aber schon auch so gemacht, bevor es die Module gab, da war's dann erst recht doppelt gemoppelt. :lol:

Das ganze steckt in einem Template-Gerüst, dass ich mir bei neuen Projekten ins Fenster hole... Einmal angelegt, nie weider drüber nachgedacht. Zumindest ist die Aussage der Beschreibung ja nicht falsch. :mrgreen:
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2023: 56 Jahre.
NeoChris
Beiträge: 205
Registriert: 21.11.2013 21:17
Wohnort: Schweiz
Kontaktdaten:

Re: Verständnisfrage zu ConnectNamedPipe_()

Beitrag von NeoChris »

thx für eure Antworten :allright: :)
Antworten