Entwickler-Ecke

Sonstiges (Delphi) - Einfacher Datenaustausch zwischen meheren Programmen im PC


ludwig altenbuchner - Fr 24.07.09 10:54
Titel: Einfacher Datenaustausch zwischen meheren Programmen im PC
Hallo,

Ich möchte innerhalb des PC zwischen mehreren Programmen Nachrichten/Daten (Strings oder Records)austauschen können. Gibt es hierfür Lösungen wie Broadcast oder Multicast im Netz?


mkinzler - Fr 24.07.09 10:58

MailSlots, Named Pipes, IPC, Sockets, ...


Tastaro - Fr 24.07.09 12:48

Hallo,

mit WM_COPYDATA lassen sich sehr leicht Strings von einer Anwendung zur anderen schicken.

Sender:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function TForm1.send(strTargetWindow, strText: string): boolean;
var
   hTargetWindow: thandle;
   recCopyData: TCopyDataStruct;
   iResult: integer;
begin
   hTargetWindow := findwindow(nil, pchar(strTargetWindow));
   if hTargetWindow <> 0 then
   begin
      recCopyData.dwData := 0;
      recCopyData.cbData := length(strText) + 1;
      recCopyData.lpData := pchar(strText);
      iResult := sendmessage(hTargetWindow, WM_COPYDATA, longint(Handle),
                    longint(@recCopyData));
      Result := (iResult = 0);
   end
   else
      Result := FALSE;
end;


Empfänger:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
  TForm2 = class(TForm)
  private
     { Private-Deklarationen }
     procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
  public
  end;

procedure TForm2.WMCopyData(var Msg: TWMCopyData);
var
   acText: array[0..1023of char;
   strReceivedText: string;
begin
   strlcopy(acText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);
   strReceivedText := string(acText);
end;


ludwig altenbuchner - Fr 24.07.09 13:15

Würde diese Lösung auch für mehrere Empfänger gleichzeitig funktionieren?


mkinzler - Fr 24.07.09 14:41

Hierfür würde sich einen Named Pipe anbieten


ffgorcky - Sa 25.07.09 09:45

Also entschuldigt, falls das jetzt eine zu einfältige Antwort ist, aber ich würde dann doch eher erst mal die Informationen, z.B. mittels MemoInfo.SaveToFile('Informationen'); in eine Datei speichern, und dann die anderen Anwendungen dort getimt nachgucken lassen, ob es neue Infos gibt.
Dadurch hat man auf jeden Fall doch auch eine Kommunikations-Doku!

- Oder hilft dort eine Lösung wie in
Delphi-Forum.de » Windows API » Daten zwischen Prozessen austauschen... aber mit var Daten [http://www.delphi-forum.de/viewtopic.php?t=42942&start=0&postorder=asc&highlight=informationen+anwendung+senden]
besser weiter?


Tastaro - Mo 27.07.09 09:34

user profile iconludwig altenbuchner hat folgendes geschrieben Zum zitierten Posting springen:
Würde diese Lösung auch für mehrere Empfänger gleichzeitig funktionieren?

Ich will dir ja nicht dan ganzen Spaß am Ausprobieren verderben.

ffgorcky hat folgendes geschrieben:

Also entschuldigt, falls das jetzt eine zu einfältige Antwort ist, aber ich würde dann doch eher erst mal die Informationen, z.B. mittels MemoInfo.SaveToFile('Informationen'); in eine Datei speichern, und dann die anderen Anwendungen dort getimt nachgucken lassen, ob es neue Infos gibt.
Dadurch hat man auf jeden Fall doch auch eine Kommunikations-Doku!


Und jede Menge zusätzliche Arbeit um zu verhindern, dass die Anwendungen sich beim Kommunizieren nicht in die Quere kommen. Außerdem hat man Millionen von überflüssigen Festplattenzugriffen.

Beste Grüße


ffgorcky - Mo 27.07.09 19:14

Ja und, user profile iconTastaro - hilft denn meine Thread-Angabe weiter?


dummzeuch - Mo 27.07.09 20:39

user profile iconTastaro hat folgendes geschrieben Zum zitierten Posting springen:

ffgorcky hat folgendes geschrieben:

mittels MemoInfo.SaveToFile('Informationen'); in eine Datei speichern, und dann die anderen Anwendungen dort getimt nachgucken lassen, ob es neue Infos gibt.
Dadurch hat man auf jeden Fall doch auch eine Kommunikations-Doku!


Und jede Menge zusätzliche Arbeit um zu verhindern, dass die Anwendungen sich beim Kommunizieren nicht in die Quere kommen. Außerdem hat man Millionen von überflüssigen Festplattenzugriffen.


Festplattenzugriffe sind kein Problem dabei, das meiste laeuft einfach nur im Cache. Kommunikation mittels Dateien ist zwar nicht hipp, aber es funktioniert in vielen Faellen zufriedenstellend. Allerdings sollte immer nur einer schreiben, alle anderen nur lesen.

twm


Tastaro - Di 28.07.09 08:09

user profile iconffgorcky hat folgendes geschrieben Zum zitierten Posting springen:
Ja und, user profile iconTastaro - hilft denn meine Thread-Angabe weiter?

Jepp, die hilft. Hab gesehen, dass darin u.a. auch mein o.g. Vorschlag beschrieben ist.


@dummzeuch: Auch wenn nur einer liest und einer schreibt kann es schon zu Problemen kommen, sofern das gleichzeitig geschehen soll. Und je höher die Anzahl der Zugriffe, desto größer ist die Wahrscheinlichkeit, dass der Fall eintritt.

Beste Grüße