Nachdem ich für mein Projekt so etwas brauche und nichts wirklich Fertiges gefunden habe, das man unmittelbar einsetzen kann, habe ich zwei Klassen für das einfache Versenden von Strings via Memory mapped files programmiert - die Klassen könnten aber bei Bedarf leicht für beliebige andere Datentypen angepasst bzw. erweitert werden.
Nachdem ich für meine Zwecke keine
Unicode-Strings brauche, wird von allen Zeichen des Strings nur das niederwertige Byte übertragen, sodass der Puffer nur halb so gross sein muss wie bei
Unicode-Zeichen. Auch das liesse sich bei Bedarf leicht ändern.
Die Kommunikation geht nur in eine Richtung, will man in beide Richtungen kommunizieren, brauchen beide Programme sowohl den Server als auch den Client.
Beim Programmieren des TIPCClient bin ich über ein Problem gestolpert, das ich nicht lösen konnte, und haBE deshalb darum herumprogrammiert. Es ist mir nicht gelungen, den Befehl OpenFileMapping so zu verwenden, dass er richtig funktioniert. Ich habe dann statt dessen CreateFileMapping mit wenn nötig gleich anschliessendem CloseHandle verwendet, ist etwas umständlicher, aber funktioniert. Für Hinweise, was an der anderen Variante (im Quellcode auskommentiert) falsch ist, wäre ich dankbar.
Die Klassen heissen TIPCServer und TIPCClient, TIPCServer dient zum Versenden der Nachrichten, TIPCClient zum Empfangen.
TIPCServer publiziert folgende Methoden:
constructor Create (const name: string; BufSize: integer);
Erzeugt ein Memory Mapped File mit der angegebenen Größe und dem angegebenen Namen. Die Grösse des Datenpuffers ist um 8 Bytes kleiner als die Grösse des Memorymapped files.
Achtung: Der Datenpuffer muss so gross gewählt werden, dass kein Überlauf entstehen kann (dass also nicht mehr Daten abgeschickt werden, als im Puffer Platz haben, bevor der Client sie abgeholt hat).
procedure Msg (const s: string);
Stellt den String S zum versenden bereit. Wenn schon ein String zum versenden bereit steht, wird dieser neue String unmittelbar an den vorigen String angehängt. Auf Empfängerseite wird #13 als Stringtrennzeichen interpretiert, d.h. der String 'abc'#13'xyz' kommt so an, als wären zwei Strings 'abc' und 'xyz' versendet worden.
procedure MsgPost;
Schickt den versandbereiten String ab.
TIPCClient publiziert folgende Methoden:
constructor Create (const name: string);
Hier muß nur der Name übergeben werden, der muss genau mit dem Namen übereinstimmen, der von TIPCServer verwendet wird.
function MitServerVerbunden: boolean;
Liefert true, wenn das MMF vom Server bereits erstellt wurde, sonst false.
function DatenDa: boolean;
Liefert true, wenn das MMF vom Server bereits erstellt wurde und neue Daten im Puffer sind, sonst false.
function GetString: string;
Holt den nächsten String aus dem Puffer. Enthält ein String ein oder mehrere #13 Zeichen, liefert Getstring bei jedem Aufruf nur den Teilstring bis zum nächsten #13. Sind keine daten zum abholen bereit, liefert Getstring den Leerstring zurück, desgleichen wenn das erste Zeichen im Puffer #13 ist.
Deshalb sollte vor dem Aufruf von GetString mit Hilfe der Funktion DatenDa überprüft werden, ob es überhaupt etwas zum Abholen gibt.
Jetzt wünsch ich noch viel Spass bei der Verwendung der beiden Klassen.