Seite 1 von 1

Verständnisfrage zu ConnectNamedPipe_()

Verfasst: 14.10.2015 20:43
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

Re: Verständnisfrage zu ConnectNamedPipe_()

Verfasst: 14.10.2015 21:37
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

Re: Verständnisfrage zu ConnectNamedPipe_()

Verfasst: 14.10.2015 21:54
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

Re: Verständnisfrage zu ConnectNamedPipe_()

Verfasst: 14.10.2015 22:03
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:

Re: Verständnisfrage zu ConnectNamedPipe_()

Verfasst: 14.10.2015 22:10
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:

Re: Verständnisfrage zu ConnectNamedPipe_()

Verfasst: 14.10.2015 23:37
von NeoChris
Kurzer hat geschrieben:

Code: Alles auswählen

;*************************************************************************
	;* Global Constants
	;*************************************************************************
Gibts den auch nicht globale Constanten :?:

Re: Verständnisfrage zu ConnectNamedPipe_()

Verfasst: 15.10.2015 00:14
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:

Re: Verständnisfrage zu ConnectNamedPipe_()

Verfasst: 15.10.2015 09:48
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:

Re: Verständnisfrage zu ConnectNamedPipe_()

Verfasst: 15.10.2015 21:11
von NeoChris
thx für eure Antworten :allright: :)