PureBoard
http://forums.purebasic.com/german/

Verständnisfrage zu ConnectNamedPipe_()
http://forums.purebasic.com/german/viewtopic.php?f=6&t=29200
Seite 1 von 1

Autor:  Kurzer [ 14.10.2015 20:43 ]
Betreff des Beitrags:  Verständnisfrage zu ConnectNamedPipe_()

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

Autor:  ts-soft [ 14.10.2015 21:37 ]
Betreff des Beitrags:  Re: Verständnisfrage zu ConnectNamedPipe_()

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

Autor:  Kurzer [ 14.10.2015 21:54 ]
Betreff des Beitrags:  Re: Verständnisfrage zu ConnectNamedPipe_()

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

Autor:  ts-soft [ 14.10.2015 22:03 ]
Betreff des Beitrags:  Re: Verständnisfrage zu ConnectNamedPipe_()

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:

Autor:  Kurzer [ 14.10.2015 22:10 ]
Betreff des Beitrags:  Re: Verständnisfrage zu ConnectNamedPipe_()

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:
Module NamedPipes
   EnableExplicit
   
   ;*************************************************************************
   ;* Global Constants
   ;*************************************************************************

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

[...]


:wink:

Autor:  NeoChris [ 14.10.2015 23:37 ]
Betreff des Beitrags:  Re: Verständnisfrage zu ConnectNamedPipe_()

Kurzer hat geschrieben:
Code:
;*************************************************************************
   ;* Global Constants
   ;*************************************************************************

Gibts den auch nicht globale Constanten :?:

Autor:  ts-soft [ 15.10.2015 00:14 ]
Betreff des Beitrags:  Re: Verständnisfrage zu ConnectNamedPipe_()

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:

Autor:  Kurzer [ 15.10.2015 09:48 ]
Betreff des Beitrags:  Re: Verständnisfrage zu ConnectNamedPipe_()

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:

Autor:  NeoChris [ 15.10.2015 21:11 ]
Betreff des Beitrags:  Re: Verständnisfrage zu ConnectNamedPipe_()

thx für eure Antworten :allright: :)

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/