2008-09-22 7 views
2

Quelqu'un at-il un bon guide sur les fonctionnalités des services Windows sous XP? En particulier, j'essaie de savoir ce qui se passe lorsqu'un programme exécuté en tant que service tente d'ouvrir Windows, mais n'a pas reçu l'autorisation d'interagir avec le bureau. Fondamentalement, j'ai un programme qui est/était une application graphique, qui devrait être capable de fonctionner comme un service pour le traitement de fond à long terme. Réécrire le programme pour ne pas afficher les éléments de l'interface graphique lorsque vous effectuez un traitement en arrière-plan est un effort majeur, alors j'aimerais voir s'il y a juste un moyen d'ignorer les éléments de l'interface utilisateur. Cela fonctionne en quelque sorte maintenant, tant que trop de fenêtres ne sont pas ouvertes. J'essaie de comprendre quelles limites je pourrais rencontrer. Idéalement, il y aurait une page MSDN qui discute de cela, mais je n'ai pas eu de chance d'en trouver un pour le moment.Que peuvent faire les services sous Windows?

Répondre

2

Un service dans Microsoft Windows est un programme qui s'exécute lorsque l'ordinateur exécute le système d'exploitation. Il ne nécessite pas un utilisateur pour être connecté.

Habituellement, il est implémenté en tant qu'application de console exécutée dans le réseau. Par exemple, la prise en charge du protocole HTTP Internet

arrière-plan et effectue des tâches qui ne nécessitent pas d'interaction de l'utilisateur.

Les services installés peuvent être configurés via l'applet Services, disponible à partir de Control Panel --> Administrative Tools sous Windows 2000/XP.

Les services peuvent être configurés pour démarrer automatiquement au démarrage du système d'exploitation, vous n'avez donc pas à les démarrer manuellement après un redémarrage du système.

  1. Creating a Simple Service - MSDN Article
  2. Writing Windows Services Made easy - Code Project Article
  3. Five Steps to Writing Windows Services in C - DevX Article
+0

La question est liée à l'existence d'une interface utilisateur d'un service Windows. Votre réponse ne traite pas du tout de l'aspect de l'assurance-chômage. – Jaywalker

8

En général, les services devraient être conçus pour ne pas avoir une interface utilisateur visible. Le point entier d'un service doit s'exécuter en arrière-plan, sans interface utilisateur, sans surveillance. (Pensez SQL Server, IIS, etc.)

Dans la plupart des cas, une application distincte contrôle le fonctionnement du service si une interface graphique est requise. (Poursuivant les exemples que je viens de mentionner, SQL Server Management Studio, Gestionnaire IIS, etc.) Ces applications distinctes configurent et manipulent le service (et parfois, si nécessaire, font rebondir ce service). Si votre service nécessite une interface utilisateur occasionnelle et que cette interface ne peut pas être isolée à une application de contrôle, vous devez probablement reconsidérer le fait que vous utilisez un service pour commencer. Peut-être une application d'interface utilisateur qui réside dans la zone de notification du système est le bon modèle à utiliser? (Par exemple, Windows Live Communicator.)

+0

L'interface utilisateur n'est pas nécessaire lors de l'exécution en tant que service, mais retravailler le programme pour ne pas afficher les fenêtres d'informations et une telle opération nécessite une réécriture majeure. J'essaie de voir si je peux simplement ignorer l'interface graphique lorsque je fais le travail en arrière-plan. –

+0

Et je suppose que l'application ne peut pas être reconvertie en service? Si c'est le cas, vous ferez probablement mieux de faire ce que vous mentionnez ci-dessus - mais je ferais un commentaire assez détaillé pour que vous ou le programmeur de maintenance comprenne le scénario! –

+0

Pas facilement. Fondamentalement, l'interface graphique de l'application sert à configurer le traitement en arrière-plan. Vous le configurez et il s'exécute alors pour toujours. Le découper en un service et un programme de contrôle est idéal, mais c'est cette énorme chose avec le traitement entrelacé avec le code de l'interface utilisateur ... –

1

Si vous envisagez éventuellement de migrer vers un système d'exploitation plus récent tel que Vista ou Server 2008, vous constaterez que vous ne pouvez pas autoriser le service à interagir avec le bureau. Par conséquent, du point de vue de la compatibilité ascendante, vous devez concevoir votre service pour ne pas l'exiger.

0

Habituellement, le service n'aura pas l'autorisation d'écrire sur la station de fenêtre et sur le bureau, de sorte qu'il échouera; même exécuter des applications qui chargent user32.dll peut échouer simplement parce que user32 a un code d'initialisation qui veut parler à la station de fenêtre et ne peut y accéder que si le service fonctionne en tant qu'administrateur.

+0

Ce serait mon attente, mais cela fonctionne pendant un certain temps, jusqu'à ce qu'un certain nombre de fenêtres aient été ouvertes (ou qu'une autre limite ait été atteinte ou que le tampon ait été dépassé). –

1

Un service dans Windows XP peut interagir avec le bureau si sa propriété «Autoriser le service à interagir avec le bureau» (MMC -> propriétés du service -> onglet Connexion) est cochée. Il est également possible de le faire en procédant comme suit:

hWinstation = OpenWindowStation("winsta0", FALSE, MAXIMUM_ALLOWED); 
SetProcessWindowStation(hWinstation); 
hDesktop = OpenDesktop("default", 0, FALSE, MAXIMUM_ALLOWED); 
SetThreadDesktop(hDesk); 

Mais sachez que la présentation de l'interface utilisateur d'un processus de service dans Windows XP entraîne presque toujours un problème de sécurité (voir Shatter attack). Vous devriez essayer de sortir la partie de l'interface utilisateur de votre application du service.

+0

En fait, je ne veux pas afficher les éléments de l'interface utilisateur. C'est bien, et préférable, s'ils ne se présentent pas. Les supprimer du programme existant est une réécriture majeure, cependant. –

+0

Doit être 'SetProcessWindowStation'-- La fenêtre est mal orthographiée dans votre code. – Jaywalker

Questions connexes