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.




 Ist mir auch schon passiert, der Debugger mit Breakpoint auf die letzte Zeile hat mich schon öfters auf die richtige Fährte zurückgebracht.
 Ist mir auch schon passiert, der Debugger mit Breakpoint auf die letzte Zeile hat mich schon öfters auf die richtige Fährte zurückgebracht. Ich habe die ganze Tischkante zerbissen. Fataler Weise ähnelten die falschen den richtigen Daten so stark, dass es mir eine Woche lang nicht aufgefallen war.
  Ich habe die ganze Tischkante zerbissen. Fataler Weise ähnelten die falschen den richtigen Daten so stark, dass es mir eine Woche lang nicht aufgefallen war.


 Verein
Verein 
 Links
Links Suche
Suche