5 Stimmen

Windows-Dienst mit GUI-Monitor?

Ich habe eine C++-Win32-Anwendung, die als Windows-GUI-Projekt geschrieben wurde, und jetzt versuche ich, herauszufinden, um es in einen Dienst / GUI-Hybrid zu machen. Mir ist klar, dass ein Windows-Dienst keine Benutzeroberfläche haben kann/soll. Aber erlauben Sie mir, zu erklären, was ich bisher habe und was ich anstrebe.

WAS ICH JETZT HABE ist eine Windows-Anwendung. Wenn sie ausgeführt wird, legt sie ein Symbol in der Taskleiste ab, auf das Sie doppelklicken können, um die grafische Benutzeroberfläche zu öffnen. Der Zweck dieser Anwendung ist die Verarbeitung von Dateien in einem bestimmten Verzeichnis nach einem nächtlichen Zeitplan. Die grafische Benutzeroberfläche besteht aus den folgenden Elementen:

  • Eine Schaltfläche zum manuellen Starten eines ungeplanten Scans/Vorgangs.
  • Eine Schaltfläche zum Öffnen eines Dialogs zum Ändern von Einstellungen.
  • Eine Listbox zur Anzeige der vom Verarbeitungs-Thread gesendeten Statusmeldungen.
  • Ein benutzerdefiniertes Fenster zur Anzeige von Bilddaten (die Dateiverarbeitung umfasst das Erstellen und Speichern von Bildern).
  • Eine Statusleiste - wenn ein Prozess nicht läuft, zeigt sie einen Countdown bis zum nächsten geplanten Scan an. Während eines Scans liefert sie auch einige Statusinformationen, einschließlich einer Fortschrittsanzeige.

WAS ICH ANSTREBE ist ein Dienst, der beim Hochfahren ausgeführt wird und keine Anmeldung eines Benutzers erfordert. Dieser Dienst würde aus der geplanten Dateiverarbeitung bestehen. Wenn sich ein Benutzer anmeldet, möchte ich jedoch, dass das Tray-Symbol geladen wird und er eine grafische Benutzeroberfläche wie oben beschrieben öffnen kann, um den aktuellen Status des Dienstes zu überwachen, Einstellungen zu ändern, einen Scan manuell zu starten und den Fortschritt eines Scans zu überwachen.

Ich bin sicher, dass ich schon solche Anwendungen gesehen habe, die auch dann als Dienst funktionieren, wenn ich nicht angemeldet bin, mir aber trotzdem eine Benutzeroberfläche bieten, mit der ich arbeiten kann, wenn ich angemeldet bin.

Ich denke, dass ich statt einer einzigen Multi-Thread-Anwendung, die vom Verarbeitungsthread Nachrichten an den GUI-Thread sendet, zwei Anwendungen benötige - einen Dienst, der die Verarbeitung durchführt, und eine GUI-Anwendung, die visuelles Feedback vom Dienst liefert und auch Nachrichten an den Dienst sendet (z. B. um einen Scan manuell zu starten). Aber ich kenne mich mit Windows-Diensten nicht aus und habe keine Ahnung, wie das geht.

Es ist auch möglich, dass ich völlig daneben liege und ein Service überhaupt nicht das ist, wonach ich suche.

Für jede Hilfe / Idee / Anregung wären wir sehr dankbar! Ich danke Ihnen.

7voto

Reed Copsey Punkte 536986

Sie können dies nicht als Dienstleistung anbieten.

Sie müssen Ihren Windows-Dienst als normale Dienstanwendung einrichten. Diese wird beim Systemstart gestartet und läuft die gesamte Zeit, in der das System in Betrieb ist.

Sie würden dann eine völlig separate GUI-Anwendung erstellen, die mit dem Dienst "spricht". Diese kann so eingestellt werden, dass sie ausgeführt wird, wenn sich ein Benutzer im Benutzerkonto anmeldet.

Damit sie miteinander "sprechen" können, müssen Sie eine Form von IPC . Da diese auf demselben System (aber in der Regel unter verschiedenen Konten) laufen, funktionieren benannte Pipes oder Sockets recht gut.

0 Stimmen

Ich danke Ihnen für Ihre Antwort. Ich habe noch nie mit IPC zu tun gehabt, aber Ihr Link sieht aus, als wäre er sehr hilfreich. Ich werde sehen, was ich lerne.

0 Stimmen

+1. Siehe auch meine Antwort unten für einige Tipps für die Umwandlung Ihrer Anwendung in einen Dienst: stackoverflow.com/questions/1554047/

0 Stimmen

Sie können dies mit einer gekoppelten Benutzeroberfläche und einem Dienst (zwei separate Einheiten) tun. Der Dienst stellt ein COM-Objekt oder einen RPC-Server zur Verfügung und die Benutzeroberfläche verbindet sich mit dem COM-Objekt/RPC-Server, um die Arbeit zu erledigen.

2voto

Michael Haephrati Punkte 3282

Es gibt einen einfachen Weg, dies zu tun.

Sie können nicht zulassen, dass der Dienst auf die Sitzung eines Benutzers (Sitzung 1, 2, 3 usw.) zugreift, da Dienste isoliert sind und nur auf Sitzung 0 zugreifen können. Dies ist eine Änderung gegenüber 2011.

Sie sollten ein Win32-Programm schreiben, das von Ihrem Dienst für jeden Benutzer gestartet wird, der sich mit https://msdn.microsoft.com/en-us/library/Windows/desktop/ms682429(v=vs.85).aspx

Der Dienst kann weiterhin alle Aufgaben ausführen, die nicht benutzerspezifisch sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X