Mit Dienst per Window-Message kommunizieren
-
Hallo zusammen,
ich möchte einen Dienst aufsetzen und nun stellt sich die Frage, wie man mit ihm kommuniziert, und zwar bidirektional.
Ich möchte versuchen, es über Windows-Messages zu realisieren. Dazu habe ich dem Dienst ein unsichtbares Fentser spendiert, damit er einen Nachrichtenmanager hat.
Nach meinen Vorstellungen müsste ja nun der Prozess, der den Dienst nutzen möchte, irgendwie dieses Fenterhandle ermitteln, damit er dorthin Nachrichten schicken kann. Wie mache ich das am besten?Ist diese Vorgehensweise überhaupt richtig oder irre ich da im falschen Wald umher?
Für hilfreiche Tipps schon mal im Voraus vielen Dank!
Wes
-
Mit Messages wirst du vermutlich Probleme bekommen, Stichwort window stations.
Eine Möglichkeit wären named pipes, eine andere wären mailslots.Eine ganz gute Übersicht an Möglichkeiten findest du z.B. hier: http://www.ddj.com/windows/184416711
(Es geht zwar in dem Artikel um .NET, aber die vorgestellten/aufgelisteten IPC/RPC Mechanismen haben nichts mit .NET zu tun sondern sind "einfach Windows")Hier noch ein Artikel aus der MSDN: http://msdn2.microsoft.com/en-us/library/aa365574.aspx
Ahja: wenn du Visual Studio (nicht Express!) verwendest ist es auch nicht schwer mit ATL ein "COM Service" zu stricken, mit dem kannst du dann einfach über eine (D)COM Schnittstelle reden. Ist clientseitig sehr angenehm, dafür auf der Server Seite ein wenig mehr Aufwand.
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Dienste (oder Treiber) besitzen normalerweise keine Fenster um Nachrichten oder Zustandsmeldungen auszugeben. Die Aufgabe solcher Hintergrundprozesse besteht auch nicht darin, Informationen zu visualisieren.
Nur für Serviceprozesse vom Typ SERVICE_INTERACTIVE_PROCESS besteht überhaupt die Möglichkeit, mit der Windows-Benutzeroberfläche zu interagieren (z.B. MessegeBox() ). Diese Art der Kommunikation im Zusammenhang mit Diensten (oder Treibern) hat allerdings derbe Nachteile (Denkaufgabe!). Für Dienste (oder Treiber) wird deshalb die Verwendung der Ereignisprotokollierung dringend empfohlen.
-
Eine übliche Weise, um mit Diensten zu kommunizieren, sind Windows Sockets, z.B. Virenscanner, die als Systemdienst arbeiten und Bedienoberflächen, um den Status des Dienstes (evtl. im Systray) anzuzeigen bzw. um Einstellungen vorzunehmen. Man könnte dem Dienst auch ein je nach Programmierlaune mehr oder weniger schönes Webinterface spendieren. Dann ist der Zugriff mit jedem Browser und nicht nur vom selben Rechner aus möglich.
Rob'
-
Ich glaube es geht hier nicht um Kommuikation mit dem User direkt, sondern mit Client Programmen...
-
Aber auch die können über Windows Sockets kommunizieren.
Rob'
-
Ok, die Variante mit den Named Pipes scheint mir am besten für das Problem geeignet zu sein. Die Handhabung ist recht simpel und das Schöne ist dabei, dass man dort auch noch eine Event-Steuerung impliziert hat.
Danke für die Tipps an alle!
Wes