Entwickler-Ecke

Dateizugriff - Kommunikation zwischen zwei Programmen ohne Formular


LittleBen - Di 14.08.12 01:19
Titel: Kommunikation zwischen zwei Programmen ohne Formular
Hallo,
ich brauche eine Kommunikationsmöglichkeit zwischen zweier Programme, wobei eins von den beiden kein Formular besitzt. Habe jetzt schon die ganze Zeit mit Messages (z.B. WndProc) rumprobiert, da eine Applikation ja schon auch ein Handle hat (Application.Handle). Hat aber nicht funktioniert... Jetzt brauche ich eine Lösung, bei der das Programm, wie bei WndProc, beim Empfangen der Message (Record) sofort etas unternimmt. Mit NamedPipes müsste man alle paar Sekunden auf Inhalte prüfen, es sollte jedoch ohne Verzögerung geschehen.
Habt ihr Idden?

Viele Grüße,
Littleben


bummi - Di 14.08.12 06:51

http://delphi.about.com/od/windowsshellapi/l/aa093003b.htm
http://forum.delphi-treff.de/showthread.php?24679-In-einer-Konsolenanwendung-auf-Messages-reagieren


jaenicke - Di 14.08.12 07:27

An den Beispielen sieht man auch schön wie das funktioniert:
Es wird auch gepollt.
Deshalb ist da auch nix Schlechtes dran, das geht bei Pipes und ähnlichen IPC Methoden ganz genauso. Teilweise eher besser. Man kann auch mit Events arbeiten, die bei neuen Daten auslösen (SetEvent, ...). Dann kann man darauf mit WaitForMultipleObjects warten.

Möglichkeiten gibt es viele, aber wichtig wäre dazu erst einmal zu wissen wie viele Daten wie oft übertragen werden.

Zu den Versuchen mit Application:
Wenn es keine Konsolenanwendung, sondern nur eine VCL-Anwendung ohne Formular ist, könnte Application.OnMessage funktionieren. Das habe ich zwar nicht ausprobiert, aber da Application.Run ausgeführt wird, könnte da etwas gehen. ;-)

Wobei ich es auch nicht für problematisch halte, wenn du einfach Application.ShowMainForm im Projektquelltext auf False setzt und so das Formular einfach unsichtbar lässt. Denn ein Fensterhandle brauchst du für Messages z.B. ja so oder so. Es muss nur kein echtes Fenster / Formular dahinterstecken.


Narses - Di 14.08.12 11:48

Moin!

Was spricht denn gegen TCP/IP? Ist Standard, funktioniert auf localhost ähnlich schnell und gut wie named-pipes, hat aber den Vorteil, dass man auch gleich die Maschinenunabhängigkeit mit drin hat (die Anwendungen müssen dann nicht mehr zwangsweise auf der selben Maschine/OS laufen). :idea: :nixweiss:

cu
Narses


jaenicke - Di 14.08.12 12:27

Eigentlich nur, dass das durch die Firewall blockiert werden könnte. Ansonsten ist das auch eine gute Möglichkeit.


LittleBen - Di 14.08.12 13:04

Vielen Dank für die Hilfe!

Habe es nun so [url]forum.delphi-treff.d...f-Messages-reagieren[/url] probiert umzusetzen. Funktioniert auch wunderbar, sofern man das Handle kennt.
Mein Problem ist nun: Wie bekomme ich das Handle von außerhalb raus? Zum Testen habe ich es mir immer per Showmessage anzeien lassen, um dann eine Testnachticht zu senden.
Habe es schon mit GetWindowHandleByExeName und GetProcessHandleFromID probiert, aber ohne Erfolg.


user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Möglichkeiten gibt es viele, aber wichtig wäre dazu erst einmal zu wissen wie viele Daten wie oft übertragen werden.
Minütlich kommen neue Daten, auf die das Programm reagieren muss.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Zu den Versuchen mit Application:
Wenn es keine Konsolenanwendung, sondern nur eine VCL-Anwendung ohne Formular ist, könnte Application.OnMessage funktionieren. Das habe ich zwar nicht ausprobiert, aber da Application.Run ausgeführt wird, könnte da etwas gehen. ;-)
Mhm...bei mir tut sich da nicht wirklich etwas :(

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wobei ich es auch nicht für problematisch halte, wenn du einfach Application.ShowMainForm im Projektquelltext auf False setzt und so das Formular einfach unsichtbar lässt. Denn ein Fensterhandle brauchst du für Messages z.B. ja so oder so. Es muss nur kein echtes Fenster / Formular dahinterstecken.
Das stimmt schon, aber ich habe das ganze Programm jetzt schon ohne Forumular geschrieben, was natürlich kein richtiger Grund ist ^^ Aber es geht ja auch ohne...hoffe ich :D

EDIT: Ich habe mir jetzt einfach mal alle aktiven Handles ausgeben lassen und dabei auch das richtige gefunden: [TPUtilWindow] '''' Handle: xxxxxxx
Wenn man das bennen könnte, könnte ich ja danach suchen