[Python-de] Frage: win32pipe.SetNamedPipeHandleState() throws ERROR_INVALID_PARAMETER!?!

replytodirk at web.de replytodirk at web.de
Don Mai 12 23:36:30 CEST 2005


Es gelingt mir nicht eine NamedPipe asynchron im Message-Mode zu betreiben.
Sobald ich den Mode mit SetNamedPipeHandleState() auf Message-Mode ändern
möchte, bekomme ich eine Exception (ERROR_INVALID_PARAMETER). Im Byte-Mode
geht's, aber wenn ich ein Paket, das größer ist als der Pipe-Buffer,
durchschicke, kommen nur len(Paket)-len(PipeBuffer) Bytes an. Das liegt wohl
daran, das ReadFile() nicht mit ERROR_MORE_DATA zurückkommt - warum? Keine
Ahnung!

Der Testcode:


SERVER

----schnipp-----
from win32pipe import *
from win32file import *
from win32event import *
import pywintypes

PipeHandle = CreateNamedPipe("\\\\.\\pipe\\foobar",
    PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
    PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
    PIPE_UNLIMITED_INSTANCES, 2048, 2048, 5000, None)
Overlapped = pywintypes.OVERLAPPED()
Overlapped.hEvent = CreateEvent(None, 1, 0, None)
ConnectNamedPipe(PipeHandle, Overlapped)
WaitForSingleObject(Overlapped.hEvent, 600000) # Warte auf CreateFile() vom
Client
Sleep(5000)
----schnapp----


CLIENT

----schnipp-----
from win32pipe import *
from win32file import *
from win32event import *
import pywintypes

PipeHandle = CreateFile("\\\\.\\pipe\\foobar",
                    GENERIC_READ | GENERIC_WRITE,
                    0, None, OPEN_EXISTING,
                    FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0)
SetNamedPipeHandleState(PipeHandle, PIPE_READMODE_MESSAGE, 0, 0)
----schnapp----
CreateFile() funktionert - aber dann:
> Traceback (most recent call last):
>   File "<pyshell#9>", line 1, in -toplevel-
>     SetNamedPipeHandleState(PipeHandle, PIPE_READMODE_BYTE, 0, 0)
> error: (87, 'SetNamedPipeHandleState', 'The parameter is incorrect.')

Warum?

Weiss jemand wie ich eine Message-Mode Pipe richtig aufsetze? Ich habe jetzt
schon viel versucht und bin an einem Punkt wo ich schon fast an einen Bug in
der PyWin32-Implementierung von SetNamedPipeHandleState() glaube...

Vielen Dank für Eure Zeit.

Gruß,
Dirk