Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Kommunikation zwischen mehreren eigenen Tools ... Womit? (https://www.delphipraxis.net/98999-kommunikation-zwischen-mehreren-eigenen-tools-womit.html)

torud 5. Sep 2007 09:37


Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Hallo Wissende,

ich habe mehrere Tools, die sich untereinander Daten austauschen sollen. Bisher habe ich es so gelöst, dass ich die Parameter per ShellExecute übergeben habe. Dies setzt jedoch voraus, dass das andere Tool, welches die Daten erhalten soll nicht gestartet ist, oder es wird eine neue Instanz erzeugt. Wenn ich nun Inhalte an meinem Hauptprogramm ändere und diese erneut senden will, würde ja das empfangende Tool erneut gestartet werden. Ich will aber lieber nur die aktualisierten Daten senden und das Tool "fischt" sich selbst raus, was neu ist und aktualisiert seine Inhalte.

Das dürfte wohl mit ShellExecute nicht laufen. Oder?

Es gibt für mich daher 2 sichtbare Wege. Ich könnte die Daten per UDP senden oder mittels TCP/Ip übertragen.

Was würdet Ihr preferieren? Und -
Gibt es auch andere Möglichkeiten?

Das ganze soll nicht nur bei mir laufen, sondern auch bei Kunden installiert werden. Daher auch die Frage, ob es überall möglich ist diese Kommunikation so zu betreiben...Die Tools sollen nicht im Netzwerk miteinander kommunizieren, sondern nur lokal auf einem PC. Gibt es sonst noch wichtige Dinge, die ich beachten muss?

Gruber_Hans_12345 5. Sep 2007 09:39

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
ich würde auch NamedPipes in betracht ziehen

und wenns nur lokal ist, könntest es auch mit MMF bzw. WM_COPYDATA machen (oder "normalen" Windows Messages - je nachdem wieviel daten)

mkinzler 5. Sep 2007 09:40

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Named Pipes, Zwischendateien, Datenbank, Messages, ...

RavenIV 5. Sep 2007 10:02

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Also das mit TCP/IP solltest Du vergessen.
Es kann sein, dass auf einem Kunden-PC kein Netzwerk installiert ist. Dann funktioniert TCP/IP nämlich nicht korrekt oder garnicht.

Am einfachsten tust Du Dir vermutlich mit Windows-Messages.
Dann ist das Thema NamedPipes sicher noch interessant.
Etwas veraltet aber dennoch perfomant sind die Mailslots.
Als Schlagwort kann ich auch noch IPC (Inter Process Communication) einwerfen.

Angel4585 5. Sep 2007 10:07

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Zitat:

Zitat von RavenIV
Also das mit TCP/IP solltest Du vergessen.
Es kann sein, dass auf einem Kunden-PC kein Netzwerk installiert ist. Dann funktioniert TCP/IP nämlich nicht korrekt oder garnicht.

Geht das echt nicht? Ich dachte nur wenn keine Netzwerkkarte drin ist?
Also dann dürfte es theoretisch nicht funzen wenn ich das Netzwerkkabel zieh?

Gruber_Hans_12345 5. Sep 2007 10:11

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Zitat:

Zitat von Angel4585
Zitat:

Zitat von RavenIV
Also das mit TCP/IP solltest Du vergessen.
Es kann sein, dass auf einem Kunden-PC kein Netzwerk installiert ist. Dann funktioniert TCP/IP nämlich nicht korrekt oder garnicht.

Geht das echt nicht? Ich dachte nur wenn keine Netzwerkkarte drin ist?
Also dann dürfte es theoretisch nicht funzen wenn ich das Netzwerkkabel zieh?

dafür gibt es einen Eintrag in der Registry ich glaub der heisst DISABLE_DHCP_MEDIA_SENSE (so oder andere schreibweise) ohne diesen deaktiviert Windows das TCP/IP Protokoll, sobald das Netzwerkkabel gezogen ist (und auch die lokale IP Adressen funktionieren dann nicht mehr)

RavenIV 5. Sep 2007 10:16

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Zitat:

Zitat von Angel4585
Geht das echt nicht? Ich dachte nur wenn keine Netzwerkkarte drin ist?
Also dann dürfte es theoretisch nicht funzen wenn ich das Netzwerkkabel zieh?

Unter "Netzwerk installiert" verstehe ich, dass alles eingbaut und konfiguriert ist und dass das Netzwerk physikalisch läuft.
Es muss also die Karte drin sein, die Treiber müssen installiert sein, TCP/IP muss konfiguriert sein, der Netzwerk-Stecker muss eingesteckt sein.
Ansonsten ist die TCP/IP-Kommunikation deaktiviert.

Versuch doch mal folgendes:
An einem Netzwerk-PC den Netzwerk-Stecker rausziehen.
Dann ein ipconfig /all auf der Console machen.
Und auch einen ping auf die eigene Adresse absetzen.
Als letztes kannst Du auch die ganzen net abc Befehle ausprobieren auf der Console.

Nun wirst Du vermutlich sehen, dass das Netzwerk (und auch TCP/IP) deaktiviert wurde.

Angel4585 5. Sep 2007 10:19

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Also hat der lokale Apache nix mit Netzwerk zu tun, denn da komm ich auch über 127.0.0.1 auf meine Seiten wenn kein Netzwerk da ist :gruebel:

RavenIV 5. Sep 2007 10:55

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Zitat:

Zitat von Angel4585
Also hat der lokale Apache nix mit Netzwerk zu tun, denn da komm ich auch über 127.0.0.1 auf meine Seiten wenn kein Netzwerk da ist :gruebel:

Das ist ein Spezialfall.
auf 127.0.0.1 kommst Du immer, wenn das Netzwerk installiert ist.
Dazu brauchst Du kein Netzwerkkabel.

Bau mal aus dem Rechner die Netzwerkkarte aus und schmeiss alle Treiber für die Netzwerkkarte raus.
Dann dürfte auch 127.0.0.1 nicht mehr gehen.

DeddyH 5. Sep 2007 11:16

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Also, ich hatte jahrelang einen Rechner ohne Netzwerkkarte. Trotzdem konnte ich Verbindungen zu Loopback-Adressen (127.0.0.X) aufbauen (ich habe damals mit den Socket-Komponenten experimentiert). AFAIK hat es nur damit zu tun, ob das TCP/IP-Protokoll installiert wurde (seit Win95 Standard).

torud 5. Sep 2007 11:26

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Ich wollte das ja auch über die Socket-Komponenten lösen, bin aber jetzt dabei mir allen möglichen Code aus dem Forum zusammen zu suchen, mit dem ich das Senden der Nachrichten, welche zu 99% aus Strings bestehen, zu realisieren.

Scheint aber doch nicht sooo einfach wie gedacht, da ich ja erstmal das Handle des Programmes herausfinden muss, welches ich ansprechen will. Dazu habe ich nun Code gefunden. Dann sende ich mit folgendem Code:

Delphi-Quellcode:
//Senden aus Tool A
  TheWindowHandle:=GetWindowHandleByExeName('Programmname.exe');
  if TheWindowHandle = 0 then
    //wenn das programm noch nicht läuft, starte es
    ShellExecute(Application.Handle, 'open' ,PChar((sender as TMenuItem).Hint), nil, nil, sw_ShowNormal);

  wparam:=globaladdAtom(pchar(str_param));
  lparam:=length(str_param);
  SendMessage(TheWindowHandle,WM_User+10,wparam,lparam);
  GlobalDeleteAtom(wparam);


//Empfangen in Tool B
procedure TForm1.Receive(var msg:TMessage);
var s:string;
    l:cardinal;
begin
  ShowMessage('kommt was!');
  SetLength(s,msg.lparam);
  l:=GlobalGetAtomName(msg.wparam,@s[1],msg.lparam+1);
  setlength(s,msg.lparam);
  ShowMessage(s);
end;
Leider kommt nichts an...Naja, vielleicht finde ich noch was passendes...

RavenIV 5. Sep 2007 11:31

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Warum arbeitest Du Dich nicht in die Themen
NamedPipes
MailSlot
ein?

Da brauchst Du dann kein Handle der Applikationen und musst die Tools nicht ständig neu starten.
Du legst eine NamedPipe oder MailSlot an, machst das im anderen Programm bekannt, steckst Daten rein und die kommen automatisch auf der anderen Seite an.

torud 5. Sep 2007 11:32

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Weil ich dazu kein Tut oder brauchbares Beispiel gefunden habe.

mkinzler 5. Sep 2007 11:39

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
http://users.adelphia.net/~rllibby/downloads/pipes.zip
http://assarbad.net/stuff/tutorials/...k_tutorial.pdf
http://www.delphipraxis.net/internal...t.php?p=229531
http://www.delphipraxis.net/internal...ct.php?t=50870

Angel4585 5. Sep 2007 11:52

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Also ich mach meine Kommunikation immer über TCP/IP und gehe einfach davon aus das dies läuft. Hatte bisher auch keine Probs damit.
Da legst du einfach für jedes Prog einen Port fest auf welchem es "wartet", connectest dann und kannst dann ganz einfach Strings senden und empfanegn wie du lustig bist.

torud 5. Sep 2007 12:58

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Danke für die Links.

Ich habe mir mal die Pipes.zip gezogen und die Komponente installiert. Allerdings gibt es absolut keine Doku dazu. Ich habe zwar gefunden, dass man wahrscheinlich Daten mit Write() senden kann, aber die ganzen Parameter, die man da angeben muss, sind für mich schon wieder eine Hürde mehr. Ich mal versuchen überhaupt erstmal eine Verbindung herzustellen...

Vielleicht finde ich ja was...raus.

RavenIV 5. Sep 2007 13:24

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Im gleichen Thread, wo Du die Komponente gefunden hast, ist auch ein Beispielprojekt dabei.

Aber Du kannst NamedPipes auch ohne Komponenten ansprechen.
Dann musst Du halt alles von hand machen, ist aber nicht aufwändig.

Bei Delphi sind bestimmt auch Demo-Projekte zu Pipes dabei.
Ansonsten werden die in jedem besseren Delphi-Buch erwähnt.

torud 5. Sep 2007 13:32

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Zitat:

Zitat von RavenIV
Im gleichen Thread, wo Du die Komponente gefunden hast, ist auch ein Beispielprojekt dabei.

Nein das stimmt so nicht, denn der Link mit dem Download war ein direkter Link auf eine Zip-Datei und die anderen Links waren zu Threads mit diesem Thema aber ohne glückliches Ende, bzw. ein Link zu einer pdf-Datei zum Thema Hooks. Ich habe auch da mal reingeschnuppert, aber das ist mir alles zu hoch. Ich brauche es einfach!

Zitat:

Zitat von RavenIV
Aber Du kannst NamedPipes auch ohne Komponenten ansprechen.
Dann musst Du halt alles von hand machen, ist aber nicht aufwändig.

Das kann ich eben nicht, da es mir da an Kenntnissen mangelt. Ich habe bisher auch KEIN funktionierendes Beispiel gefunden.

Zitat:

Zitat von RavenIV
Bei Delphi sind bestimmt auch Demo-Projekte zu Pipes dabei.
Ansonsten werden die in jedem besseren Delphi-Buch erwähnt.

Auch das ist leider nicht der Fall. Zumimdest ist in meinem Demo-Ordner nichts dazu zu finden.

Ich würde ja gerne die NamedPipes nehmen, aber es funktioniert einfach nicht! Weder mit den Codes, die ich hier im Forum fand, noch mit der Komponente. Bei letzerer weiss ich allerdings nicht, wie man sie einsetzt. Wäre es so einfach wie es aussieht, wäre das schon toll. Ich will doch nur Strings zwischen den Programmen austauschen. Warum ist das soo kompliziert?

RavenIV 5. Sep 2007 13:41

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Liste der Anhänge anzeigen (Anzahl: 3)
Schau Dir mal die drei angehängten Files an.
Die sollten so eigentlich zusammenpassen.

Hab ich auch hier in DP gefunden, sind also nicht von mir.

hathor 5. Sep 2007 13:43

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
SHARED MEMORY!

Viele Programme, die Daten von Plugins oder anderen Programmen bekommen, arbeiten damit:

MBM, Speedfan, Everest, Samurize, Rainmeter, Rivatuner, LCDsmartie, LCDhype, ATItools etc.

RavenIV 5. Sep 2007 13:45

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Zitat:

Zitat von hathor
SHARED MEMORY!

Viele Programme, die Daten von Plugins oder anderen Programmen bekommen, arbeiten damit:

MBM, Speedfan, Everest, Samurize, Rainmeter, Rivatuner, LCDsmartie, LCDhype, ATItools etc.

Klare Sache. :shock: :wall:
Das wäre das letzte, das ich benutzen würde. :warn:

Denn jedesmal wenn das SharedMamory angepasst wird, müssen alle Applikationen neu erstellt werden. :roteyes: :roteyes:

torud 5. Sep 2007 13:56

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Danke für Deine Mühe, aber es funktioniert einfach nicht. Ich habe die Komponenten installiert und anschliessend den Server und den Client kompiliert, alles ohne Änderungen!

Danach habe ich den Server gestartet und aktiviert.

Anschliessend habe ich den Client gestartet und die Checkbox RUN aktiviert. Das Programm steht eine Weile still, wohl weil es versucht sich zu connecten und dann schreibt der Client in seine Liste: Could not Create Pipe Instance 1 of 53...

UND NUN???

RavenIV 5. Sep 2007 13:59

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Ursachenforschung?
Vielleicht musst Du es noch an Dein System / Umgebung anpassen?

Ich hab das Zeugs schon länger mal runtergeladen, weil ich's vielleicht mal brauchen könnte.
Angeschaut oder verwendet hab ich es allerdings noch nie.

torud 5. Sep 2007 15:06

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Tscha Kinners. Ich habe leider keine Ahnung. Der Code in dem Client läuft über nen Timer. Warum weiss ich auch nicht. Eigentlich dachte ich, dass der Client sich von selbst meldet, wenn er eine Nachricht erhält, aber dem ist wohl nicht so...

Der Server zeigt auch nicht wirklich an, dass er eine Verbindung zum Client hat. Also wenigstens funktioniert es so ganz und gar nicht. Und um auf Deine Frage einzugehen: Was sollte ich denn noch auf meinem System anpassen müssen?

Kedariodakon 5. Sep 2007 15:13

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Zitat:

Zitat von RavenIV
Denn jedesmal wenn das SharedMamory angepasst wird, müssen alle Applikationen neu erstellt werden. :roteyes: :roteyes:

Was wie wo angepasst? Das möcht ich genauer wissen :gruebel:

C.Schoch 5. Sep 2007 15:21

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
Ich hab das gerade mal bei mir getestet, es geht wenn man als Servernamen einen "." einträgt.
Warum kann ich auch nicht genau sagen.

RavenIV 5. Sep 2007 15:22

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Zitat:

Zitat von Kedariodakon
Zitat:

Zitat von RavenIV
Denn jedesmal wenn das SharedMamory angepasst wird, müssen alle Applikationen neu erstellt werden. :roteyes: :roteyes:

Was wie wo angepasst? Das möcht ich genauer wissen :gruebel:

Wenn man an der Struktur des SharedMenory etwas ändert, muss man alle Applikationen neu kompilieren.
z.B.:
- Variablen hinzugefügt
- Typen verändert
- Länge von Variablen verändert

RavenIV 5. Sep 2007 15:27

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Zitat:

Zitat von C.Schoch
Hi,
Ich hab das gerade mal bei mir getestet, es geht wenn man als Servernamen einen "." einträgt.
Warum kann ich auch nicht genau sagen.

Der "." ist der lokale PC.
Hab ich auch nicht dran gedacht.
Bzw. hast Du ja den Fehler nicht in diese Richtung beschrieben...

C.Schoch 5. Sep 2007 15:40

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Stimmt! Wenn ich meinen Rechnernamen eintrage dann gehts auch!
afaik
Das ganze geht auch im Netzwerk? :gruebel:

Kedariodakon 5. Sep 2007 15:51

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Wenn konfiguriert und freigegeben, dann ja :zwinker:

RavenIV 5. Sep 2007 16:01

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Ja, NamedPipes funktionieren auch im Netzwerk.
MailSlots prinzipiell auch, dafür benötigt man aber dann eine Netzwerk-Domäne oder Workgroup.

torud 5. Sep 2007 18:21

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Also das ist doch aber als Vorgabe eingestellt.

Server:
Name = gnsPipeServer1
Pipename = Test

Client:
Name = gnsPipeClient1
PipeName = test
Server = . //ist Vorgabe

Bei mir gehts nicht...Fehler wie oben schon beschrieben...

torud 5. Sep 2007 18:38

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Ich nehme alles zurück ab Guten Morgen!!!

Ich habe das Bild erst eben gesehen, WO ich den . eingeben muss und dann gehts wirklich!!!

oki 5. Sep 2007 18:56

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Hi torud,

jetzt muß ich hier auch mal meinen Senf dazu geben.
Auch wenn ich RavenIV's Meinung schätze, kann ich seine Aussagen zu TCP/IP nicht unterstützen. Ich halte sie sogar für grund falsch!
Die Funktionsfähigkeit von TCP/IP auf einem Rechner ist vorrangig an die Installation gebunden. Ob die Netzwerkkarte aktiv ist, ist dabei nicht relevant. Ich kann auch einen virtuellen WAN-Treiber installieren und TCP/IP funzt.
Das bei gezogenem Netzwerkkabel ab XP die Netzwerkkarte deaktiviert wird und somit die eingetragene IP-Adresse nicht mehr gültig ist verhindert trotzdem nicht den Zugriff auf 127.0.0.1 (LocalHost). Damit kann ich dann locker jeden Socket-Server auf meinem Rechner erreichen.
Ich muß auch ehrlich sagen, dass ich seit Jahren keinen Rechner mehr ohne Netzwerk gesehen habe. Desweiteren finden sich haufenweise Tuts und Beispiele für Socket-Verbindungen. Die Handhabung ist imho simpel.

Damit will ich nicht sagen, dass es Pipes nicht tun, aber einen Blick sind die Sockets schon wert.

Gruß oki

torud 5. Sep 2007 19:16

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Ciao Oki,

"lange" nichts von Dir gelesen. Ich glaube seit den CustomControls!? :lol:

Hätte das heute vormittag schon gelesen, hätte ich es direkt mit den Socket-Verbindungen gemacht, da ich dies schon des öfteren so gehandhabt habe - dies aber immer auf Firmeneigenen PC´s, wo die Hardwareumgebung bekannt ist bzw. notfalls angepasst wurde. Ich möchte jetzt nicht Ravens Bemühungen durch sofortiges Abwenden von den NamedPipes untergraben und werde mich also noch ein wenig quählen.

Damit ich nun endlich ans Ziel komme, müsste ich nur noch wissen, wie ich an den gesendeten Inhalt komme, denn gesendet wird ja, so wie ich das überblicke, immer das gesamte Alphabet, aber der Server zeigt nut die empfangenen "Pakete" an.

Diese Procedure hängt am Server und sollte mir eigentlich auch den geschickten Content liefern können....Oder!?
Delphi-Quellcode:
procedure TForm2.gnsPipeServer1ProcessMessage(Sender: TObject;
  aByteArray: Pointer; BufferSize, InCount: Cardinal;
  var OutCount: Cardinal; var DisconnectClient: Boolean);
var
  I: Cardinal;
  Temp: TByteArray;
begin
  lbl_count.Caption := IntToStr(Succ(StrToIntDef(lbl_count.Caption, 0)));
  for I := 0 to Pred(InCount) do
    Temp[I] := TByteArray(aByteArray^)[Pred(InCount - I)];
  for I := 0 to Pred(InCount) do
    TByteArray(aByteArray^)[I] := Temp[I];
end;

oki 5. Sep 2007 19:45

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Hi torud,

sorry, aber ich bin bei den Pipes nicht so fitt. Ich wollte die auch nicht schlecht machen, sondern nur die Aussage gegen die Sockets korrigieren. Wenn das mit den Pipes klappt, mach es, denn die Sockets haben auch ihre Tücken.

Gruß oki

[OT] Hat das mit den Controls geklappt? [/OT]

torud 5. Sep 2007 20:04

Re: Kommunikation zwischen mehreren eigenen Tools ... Womit?
 
Hi Oki,

Danke für Dein Feedback. Ich werde noch etwas damit versuchen und wenn es klappt, dann würde ich die Pipes den Sockets vorziehen, da ich hier auch den Server nach dem Client starten könnte.

[ot]
Die Controls habe ich weiter gebaut, aber es gibt noch diverse Probs. Ich werde in dem Thread nochmals posten.
[/ot]


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:36 Uhr.

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