2010-07-01 4 views
4

J'ai une application C++ Win32 qui a été écrite en tant que projet Windows GUI, et maintenant j'essaie de comprendre pour en faire un hybride Service/GUI. Je comprends qu'un service Windows ne peut/ne doit pas avoir une interface utilisateur. Mais permettez-moi d'expliquer ce que j'ai jusqu'ici et ce que je suis en train de photographier.Service Windows avec moniteur graphique?

CE QUE JE SUIS est une application Windows. Lorsqu'il est exécuté, il place une icône dans la barre d'état système sur laquelle vous pouvez double-cliquer pour ouvrir l'interface graphique. Le but de cette application est de traiter les fichiers situés dans un répertoire spécifié selon un horaire nocturne. L'interface graphique se compose des éléments suivants:

  • Un bouton pour lancer un balayage/processus non planifié manuellement.
  • Un bouton pour ouvrir une boîte de dialogue pour modifier les paramètres.
  • Une zone de liste pour afficher les messages d'état envoyés à partir du thread de traitement.
  • Une fenêtre dessinée personnalisée pour afficher des données d'image (le traitement de fichier comprend la création et la sauvegarde d'images).
  • Une barre d'état - lorsqu'un processus n'est pas en cours d'exécution, il affiche un compte à rebours jusqu'à la prochaine analyse planifiée. Au cours d'un scan, il fournit également un retour d'état, y compris une barre de progression.

QU'EST-CE QUE JE POUR PRISE DE VUE est un service qui fonctionnera sur démarrage et ne nécessite pas un utilisateur de se connecter. Cela consisterait en le traitement de fichier planifié. Cependant, lorsqu'un utilisateur se connecte, je voudrais quand même que l'icône de la barre soit chargée et lui permette d'ouvrir une interface graphique comme décrit ci-dessus pour surveiller l'état actuel du service, modifier les paramètres, lancer un scan manuellement et suivre la progression d'un scan.

Je suis sûr que je l'ai vu des applications comme celle-ci -. Cette fonction en tant que service, même quand je ne suis pas loggué, mais encore me donner une interface utilisateur de travailler avec une fois que je ne connecte

Je pense qu'au lieu d'avoir une seule application multithread qui envoie des messages au thread GUI à partir du thread de traitement, j'ai besoin de deux applications - un service pour effectuer le traitement et une application graphique pour fournir des commentaires visuels du service et aussi envoyer des messages au service (par exemple, pour démarrer une analyse manuellement). Mais je suis nouveau pour Windows Services et je n'ai aucune idée de comment cela est fait.

Il est également possible que je sois complètement hors de la base et un service n'est pas ce que je cherche du tout.

Toute aide, idée ou suggestion serait grandement appréciée! Je vous remercie.

Répondre

5

Vous ne pouvez pas faire cela en tant que service.

Vous devez configurer votre service Windows en tant qu'application de service normale. Cela démarrera au démarrage du système et fonctionnera pendant toute la durée de fonctionnement du système. Vous devrez ensuite créer une application GUI complètement séparée, qui "parle" au service. Cela peut être configuré pour s'exécuter lorsqu'un utilisateur se connecte, dans le compte de l'utilisateur. Pour les faire «parler», vous devrez utiliser une forme de IPC. Étant donné que ceux-ci s'exécutent sur le même système (mais généralement dans des comptes différents), les canaux nommés ou les sockets fonctionnent tous deux très bien.

+0

Nous vous remercions de votre réponse. Je n'ai jamais traité avec IPC mais votre lien semble être très utile. Je verrai ce que j'apprends. –

+0

+1. Consultez également ma réponse ci-dessous pour obtenir quelques conseils pour configurer votre application en ligne: http://stackoverflow.com/questions/1554047/convert-ac-program-to-a-windows-service/1554405#1554405 –

+0

Vous peut le faire avec l'interface utilisateur et le service appariés (deux entités distinctes). Le service expose un objet COM ou un serveur RPC et l'interface utilisateur se connecte à l'objet COM/serveur RPC pour effectuer le travail. –

0

Il existe un moyen simple de le faire.

Vous ne pouvez pas autoriser le service à accéder à la session d'un utilisateur (session 1,2,3 ..) car les services sont isolés et peuvent uniquement accéder à la session 0. Ceci est un changement de 2011.

Vous devez écrire un programme win32 qui sera lancé par votre service pour chaque utilisateur qui se connecte à l'aide https://msdn.microsoft.com/en-us/library/windows/desktop/ms682429(v=vs.85).aspx

Le service peut continuer d'effectuer toute tâche qui n'est pas utilisateur spécifique.

Questions connexes