Autor Beitrag
LittleBen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 258
Erhaltene Danke: 4

Win 7, Mac OS
Delphi 7
BeitragVerfasst: Di 14.08.12 01:19 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Di 14.08.12 06:51 

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 258
Erhaltene Danke: 4

Win 7, Mac OS
Delphi 7
BeitragVerfasst: 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