[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