Autor Beitrag
ludwig altenbuchner
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 24.07.09 10:54 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Fr 24.07.09 10:58 
MailSlots, Named Pipes, IPC, Sockets, ...

_________________
Markus Kinzler.
Tastaro
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 414
Erhaltene Danke: 23



BeitragVerfasst: Fr 24.07.09 12:48 
Hallo,

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

Sender:
ausblenden 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:

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 24.07.09 13:15 
Würde diese Lösung auch für mehrere Empfänger gleichzeitig funktionieren?
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Fr 24.07.09 14:41 
Hierfür würde sich einen Named Pipe anbieten

_________________
Markus Kinzler.
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: 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
besser weiter?
Tastaro
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 414
Erhaltene Danke: 23



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Mo 27.07.09 19:14 
Ja und, user profile iconTastaro - hilft denn meine Thread-Angabe weiter?
dummzeuch
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 593
Erhaltene Danke: 5


Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 414
Erhaltene Danke: 23



BeitragVerfasst: 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