Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Kommunikation zwischen zwei Delphi-Programmen (https://www.delphipraxis.net/204417-kommunikation-zwischen-zwei-delphi-programmen.html)

Int3g3r 27. Mai 2020 15:22

Kommunikation zwischen zwei Delphi-Programmen
 
Guten Tag,

Ich habe zwei Delphi-Programme die miteinander kommunizieren sollen.

Programm 1 -> Sendet Telefonnummer per Startparametern an Programm 2
Programm 2 -> Soll Name, Adresse, Ort etc. zurück an Programm 1 liefern.

Wie lässt sich dies elegant lösen ?
Das einfachste was ich mir überlegt habe ist das Programm 2 die Daten in eine textdatei schreibt und Programm 1 diese ausliest.
Damit bin ich aber nicht wirklich zufrieden. Am liebsten möchte ich das Programm 2 einen Record mit allen Daten zurückliefern.
Somit habe ich mich schlau gemacht und bin auf "Memory Mapped Files" gestossen.

Delphi-Treff
Beispiel

Das Obere Beispiel habe ich getestet. Dies wäre genau das was ich suche.
Beim Empfänger kommen nur keine Daten an.

1) Muss die "WMMFNOTIFY" procedure manuell ausgeführt werden ?
Da hier "NOTIFY" geschrieben ist gehe ich davon aus das der Sender den Empfänger informiert und die daten danach gelesen werden, ist dies korrekt ?

2) Für mich ist auch unklar für was die Variable "(var msg: TMessage)" benutzt wird.
Bzw "procedure WMMMFNOTIFY(var msg: TMessage); message WM_MMFNOTIFY;" -> Habe eine solche procedure definition noch nie gesehen.

Delphi-Quellcode:
procedure TTReceiver.WMMMFNOTIFY(var msg: TMessage);
var
  MyData: TMyData;
begin
  MyData := ReadFromMMF('MyFileMapping');
  Edit1.Text := MyData.Zeichenkette;
  CheckBox1.Checked := MyData.BoolVar;
  Edit2.Text := IntToStr(MyData.Zahl);
end;
Freundliche Grüsse,
Int3g3r

Hobbycoder 27. Mai 2020 15:38

AW: Kommunikation zwischen zwei Delphi-Programmen
 
Nimm gleich die Indy TIdTCPServer / TIdTCPClient. Dann kannst du beide auch auf unterschiedlichen Rechnern laufen lassen.

Der schöne Günther 27. Mai 2020 15:40

AW: Kommunikation zwischen zwei Delphi-Programmen
 
Es gibt zur Inter-Prozesskommunikation (IPC) auf Windows so viele verschiedene Wege. Wirklich viele.
Ich würde das ehrlich gesagt das auch über Sockets machen, soweit man keinen anderen Grund hat (bspw. sehr hohe Datenmengen oder ultra-geringe Latenz).

Int3g3r 27. Mai 2020 15:58

AW: Kommunikation zwischen zwei Delphi-Programmen
 
Ich wollte es eigentlich vermeiden Strings zu senden.
Diese muss ich dann entweder in spezifischer Reihenfolge einlesen / verarbeiten.

Der Vorteil wäre im Memory das ich direkt auf einen Record zugreifen könnte.
Also hätte ich direkt einen Datentyp der bereits sauber strukturiert ist.

Oder ist es möglich einen Record per Socket zu versenden und diesen danach als Record zu empfangen ?

Danke für die Hilfe,
Int3g3r

Der schöne Günther 27. Mai 2020 16:03

AW: Kommunikation zwischen zwei Delphi-Programmen
 
Wenn du dir, um Arbeit zu sparen, wirklich die Daten 1:1 austauschen willst wie sie grade im Speicher liegen musst du allerdings auch sicherstellen dass beide Programme mit exakt den gleichen Compilern und Compiler-Einstellungen (Record-Padding, ...) erstellt wurden. Ist dir das klar?

Typen mit automatischer Referenzzählung (Strings, dynamische Arrays, ...) kannst du über so eine Methode sowieso nicht versenden, da bekämen sich beide Programme nur in die Haare. Dann fängst du, wenn du z.B. deine Dinge wie Adresse liefern willst, sowieso wieder an, Strings erst in Char-Arrays mit fester Größe zu stopfen um sie dann zu übertragen.

Und ich glaube mit Sockets über TCP (oder vlt. sogar HTTP/REST) ist man da sogar schneller und unkomplizierter fertig.
Ich sehe Dinge wie Memory Mapped Files eher bei Dingen wie großen Bitmaps und ähnlichem, aber die Entscheidung liegt natürlich bei dir.

Jumpy 27. Mai 2020 16:10

AW: Kommunikation zwischen zwei Delphi-Programmen
 
Wenn ich das richtig gelesen habe, wird Programm2 jedes mal mit der Nummer als Startparameter von Programm1 gestartet. Liefert die anderen Daten und schließt sich dann wieder?

Dann mach doch ein Konsolenprogramm mit dem Ergebnis als Output. Ja ist wieder Strings, aber einen String zu splitten und auf einen Record aufzuteilen ist mit ein paar Zeilen Code ereldigt

Int3g3r 27. Mai 2020 16:14

AW: Kommunikation zwischen zwei Delphi-Programmen
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1465540)
Wenn du dir, um Arbeit zu sparen, wirklich die Daten 1:1 austauschen willst wie sie grade im Speicher liegen musst du allerdings auch sicherstellen dass beide Programme mit exakt den gleichen Compilern und Compiler-Einstellungen (Record-Padding, ...) erstellt wurden. Ist dir das klar?

Nein das war mir nicht klar.

Danke für die Hilfe, werde es mit den Indy Komponenten lösen.

Gruss,
Int3g3r

Int3g3r 27. Mai 2020 16:17

AW: Kommunikation zwischen zwei Delphi-Programmen
 
Zitat:

Zitat von Jumpy (Beitrag 1465542)
Wenn ich das richtig gelesen habe, wird Programm2 jedes mal mit der Nummer als Startparameter von Programm1 gestartet. Liefert die anderen Daten und schließt sich dann wieder?

Dann mach doch ein Konsolenprogramm mit dem Ergebnis als Output. Ja ist wieder Strings, aber einen String zu splitten und auf einen Record aufzuteilen ist mit ein paar Zeilen Code ereldigt

Ja fast, es werden auch Orte und Namen als Startparameter übergeben. Dann soll der User den gesuchten Eintrag selektieren (bei mehreren Resultaten) und nur der gesuchte Eintrag wird zurückgegeben.
Somit reicht ein Konsolenprogramm nicht aus da es dem user präsentiert wird und dieser in einem Grid die Selektion vornehmen kann.

Lemmy 27. Mai 2020 18:50

AW: Kommunikation zwischen zwei Delphi-Programmen
 
Zitat:

Zitat von Int3g3r (Beitrag 1465539)
Ich wollte es eigentlich vermeiden Strings zu senden.
Diese muss ich dann entweder in spezifischer Reihenfolge einlesen / verarbeiten.

Dazu gibt es Json, XML,... die dir das geparst als Objektstruktur dann wieder zur Verfügung stellen...

himitsu 27. Mai 2020 20:06

AW: Kommunikation zwischen zwei Delphi-Programmen
 
Zitat:

Zitat von Lemmy (Beitrag 1465559)
Dazu gibt es Json, XML,... die dir das geparst als Objektstruktur dann wieder zur Verfügung stellen...

Und weitergedacht auch noch SOAP, REST, DataSnap, .............,
also nicht nur das Datenformat, sondern gleich auch das ganze Protokoll/Framework zur Datenübertragung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:02 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz