Nachdem für mein aktuelles projekt eine Kommunikation zwischen zwei Prozessen erforderlich ist, bin ich über "named pipes" gestolpert. Das ist vermutlich die beste Methode, Daten zwischen den Programmen auszutauschen.
Jetzt bastle ich schon eine ganze Weile an einem einfachen Testprogramm, aber ich komme auf keinen grünen Zweig.
Das ist der Server:
Code: Alles auswählen
program pipeserver;
uses
Windows, SysUtils;
const
PIPE_ACCESS_DUPLEX = 3;
PIPE_TYPE_MESSAGE = 4;
PIPE_READMODE_MESSAGE = 2;
PIPE_WAIT = 0;
PIPE_NAME = '\\.\pipe\MDB';
BUFSIZE = 128;
var
hPipe: THandle;
geschrieben, gelesen: DWORD;
msg: string[127];
procedure fehler(const s: string);
begin
raise Exception.Create('Fehler ' + IntToStr(getlasterror) + ' ' + s) ;
end;
begin
try
// Pipe erstellen
hPipe := CreateNamedPipe(PIPE_NAME, PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE or PIPE_READMODE_MESSAGE or PIPE_WAIT,
1, BUFSIZE, BUFSIZE, 0, nil);
if hPipe = INVALID_HANDLE_VALUE
then fehler('Fehler beim Erstellen der Pipe');
// Warte auf eine Verbindung des Clients
WriteLn('Warte auf Client...');
if not ConnectNamedPipe(hPipe, nil)
then begin
Write('Client Verbindung klappt nicht.'); readln;
fehler('beim Verbinden');
end;
// Lese die Nachricht des Clients
writeln ('Lese Nachricht');
if not ReadFile(hPipe, msg, BUFSIZE, gelesen, nil)
then fehler('beim Lesen');
// Nachricht des Clients ausgeben
WriteLn('Nachricht vom Client: ', msg);
// Sende Antwort zurück an den Client
msg := 'Server Antwort: ' + msg;
if not WriteFile(hPipe, msg, Length(msg)+1, geschrieben, nil)
then fehler('beim Schreiben');
WriteLn('Gesendet: ', msg);
// Schließe die Pipe
CloseHandle(hPipe);
except
on E: Exception do begin WriteLn(E.Message); readln end;
end;
end.
Code: Alles auswählen
program pipeclient;
uses
Windows, SysUtils;
const
PIPE_NAME = '\\.\pipe\MDB';
BUFSIZE = 128;
var
hPipe: THandle;
geschrieben, gelesen: DWORD;
msg: string[127];
procedure fehler(const s: string);
begin
raise Exception.Create('Fehler ' + IntToStr(getlasterror) + ' ' + s) ;
end;
begin
write('Client gestartet - Enter drücken'); readln;
try
// Pipe öffnen
hPipe := CreateFile(PIPE_NAME, GENERIC_READ or GENERIC_WRITE,
0, nil, OPEN_EXISTING, 0, 0);
if hPipe = INVALID_HANDLE_VALUE
then fehler('beim Verbinden');
WriteLn('Mit Server verbunden.');
// Sende eine Nachricht an den Server
write('Enter message: '); readln(msg);
if not WriteFile(hPipe, msg, Length(msg)+1, geschrieben, nil)
then fehler('beim Schreiben');
WriteLn('Nachricht an den Server gesendet: ', msg);
// Lese die Antwort des Servers
if not ReadFile(hPipe, msg, BUFSIZE, gelesen, nil)
then fehler('beim Lesen');
// Ausgabe der Antwort des Servers
WriteLn('Empfangen: ', msg);
// Schließe die Pipe
CloseHandle(hPipe);
except
on E: Exception do begin WriteLn('Fehler: ', E.Message); readln end;
end;
end.
Aber sobald der Client eine Nachricht an den Server absetzt (writefile Zeile 36) schließen sich BEIDE Konsolenfenster kommentarlos. Nicht einmal die Exceptions kommen zum Tragen, es gibt weder beim Serverprogramm noch beim Clientprogramm irgendeine Meldung.