Entwickler-Ecke

Windows API - Nachricht an anderes Programm


Peter18 - Mi 07.09.16 13:37
Titel: Nachricht an anderes Programm
Ein freundliches Hallo an alle,

ich möchte durch ein Überwachungsprogramm eine Nachricht an ein anderes Programm schicken, das auf dem gleichen Rechner läuft. Wie man feststellt, ob das Programm läuft habe ich gefunden, aber keinen Datenaustausch; sollte doch möglich sein?!?!

Ich hoffe jemand kann mir die richtigen Stichworte geben oder vielleicht sogar ein Beispiel.

Grüße von der sonnigen Nordsee

Peter


Ralf Jansen - Mi 07.09.16 13:51

Stichwort ist IPC (inter-process communication).

Gängige Verfahren (oder ehemals gängige Verfahren) wären
- Windows Messages (WM_CopyData)
- DDE
- (D)COM
- Files
- Mapped Files
- MailSlots
- (Named) Pipes
- Remote Procedure Calls (RPC)
- Sockets
- Clipboard

und die die ich vergessen habe.

Deine nächste Frage: Welches sollte ich nehmen
Antwort: Kommt drauf an


t.roller - Mi 07.09.16 14:12

http://delphi.about.com/od/windowsshellapi/a/wm_copydata.htm


Peter18 - Mi 07.09.16 14:18

Hallo Ralf,

Dank Dir für Deine Antwort! Sie erschlägt einen etwas. Da mir die Eigenschaften nicht geläufig sind, eine Kurze Beschreibung meines Vorhabens:

Ich möchte beim Eintreten eines bestimmten Ereignisses ein anderes Programm auffordern eine bestimmte Mitteilung anzuzeigen. Welche Daten dabei ausgetauscht werden ist noch nicht klar. Im Zweifelsfall reicht ein Byte. Aber die Nachricht soll in "Echtzeit" erscheinen.

Vielleicht hast Du einen Tipp welche Möglichkeit dafür am besten geeignet ist.

Wenn Du eine Übersicht geben kannst, welche Eigenschaften die verschiedenen Möglichkeiten haben, wär das schön. Und wenn ich mich dann noch wieter informieren kann wär es fantastisch, aber vielleicht reichen die Stichworte schon für die weitere Suche.

Grüße von der Nordsee

Peter


Peter18 - Mi 07.09.16 14:24

Hallo t.roller,

Dank auch Dir! Sieht vielversprechend aus. Werd ich mir gleich mal in Ruhe ansehen und melde mich dann wieder.

Grüße von der Nordsee

Peter


Peter18 - Mi 07.09.16 15:22

Hallo t.roller,

nochmals Dank; sieht so aus, wie das, was ich brauche.

Grüße von der Nordsee

Peter


t.roller - Mi 07.09.16 16:31

Hier ist das gleiche Verfahren übersichtlicher dargestellt:
http://delphidabbler.com/tips/51
http://www.swissdelphicenter.com/de/showcode.php?id=810

Sonst Demo von
http://delphi.about.com/library/weekly/code/wm_copydata.zip

WM_COPYDATA ist schnell: 2ms für String, Image oder Record - siehe Anhang.


Peter18 - Do 08.09.16 10:46

Hallo t.roller,

nochmals Dank für Deine Antwort! Es sieht wirklich so aus, wie das, was ich gesucht habe.

Grüße von der wieder sonnigen Nordsee

Peter


jaenicke - Do 08.09.16 14:00

Wobei du für bis zu zwei Integerwerten auch nur eine simple Message brauchst. WM_COPYDATA brauchst du nur, wenn du mehr übertragen willst.


Peter18 - Do 08.09.16 15:27

Hallo Sebastian,

Dank auch Dir. Wenn ich Dich richtig verstehe geht statt "WM_COPYDATA" auch ein Integerwert? Dann muß aber der Enpfänger wissen, dass es nur eine Zahl ist, oder?

Grüße von der sonnigen Nordsee

Peter


jaenicke - Do 08.09.16 16:00

Du brauchst lediglich ein Fensterhandle. Das kann auch nur ein für diesen Zweck erzeugtes Handle sein wie es TTimer intern macht.

Dann schickst du mit PostMessage (ohne auf Abarbeitung zu warten) oder SendMessage (mit warten) eine selbst definierte Nachricht:

Delphi-Quelltext
1:
2:
3:
4:
const
  cMyMessage = WM_USER + 103;

PostMessage(TargetHandle, cMyMessage, 1220);
Und zum Empfangen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type
  TFormXY = class...
  protected
    procedure WmMyMessage(var Msg: TMessage); message cMyMessage;
  end;

procedure TFormXY.WmMyMessage(var Msg: TMessage);
begin
  ShowMessage(IntToStr(Msg.lParam));
end;


Ach ja: Weil bei dir noch Delphi 4 steht:
Hast du dir eigentlich das bis heute oder so kostenlose brandneue Delphi 10.1 Starter geholt? ;)