2008-09-03 10 views
7

La création d'un service Windows à l'aide de Visual Studio est donc relativement simple. Ma question va un peu plus loin sur ce qui rend un exécutable installable en tant que service & comment écrire un service en tant qu'application C directe. Je n'ai pas trouvé beaucoup de références à ce sujet, mais je présume qu'il doit y avoir une interface que je peux implémenter pour que mon .exe puisse être installé en tant que service.Création d'un service Windows sans Visual Studio

Répondre

3

La configuration de votre exécutable en tant que service en fait partie, mais de manière réaliste, elle est généralement gérée par le logiciel d'installation que vous utilisez. Vous pouvez utiliser l'outil SC de la ligne de commande lors des tests (ou si vous n'avez pas besoin d'un installateur).

L'important est que votre programme doit appeler StartServiceCtrlDispatcher() au démarrage. Cela connecte votre service au gestionnaire de contrôle de service et met en place une routine ServiceMain qui est le point d'entrée principal de vos services. ServiceMain (vous pouvez l'appeler comme vous voulez, mais il semble toujours être ServiceMain) devrait alors appeler RegisterServiceCtrlHandlerEx() pour définir une routine de rappel afin que le système d'exploitation puisse notifier votre service lorsque certains événements se produisent.

Voici quelques extraits d'un service que j'ai écrit il y a quelques années:

mis en place comme service:

SERVICE_TABLE_ENTRY ServiceStartTable[] = 
{ 
    { "ServiceName", ServiceMain }, 
    { 0, 0 } 
}; 

if (!StartServiceCtrlDispatcher(ServiceStartTable)) 
{ 
    DWORD err = GetLastError(); 
    if (err == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) 
     return false; 
} 

ServiceMain:

void WINAPI ServiceMain(DWORD, LPTSTR*) 
{ 
    hServiceStatus = RegisterServiceCtrlHandlerEx("ServiceName", ServiceHandlerProc, 0); 

gestionnaire de services:

DWORD WINAPI ServiceHandlerProc(DWORD ControlCode, DWORD, void*, void*) 
{ 
    switch (ControlCode) 
    { 
    case SERVICE_CONTROL_INTERROGATE : 
     // update OS about our status 
    case SERVICE_CONTROL_STOP : 
     // shut down service 
    } 

    return 0; 
} 
1

Je sais que je suis un peu en retard à la fête, mais j'ai récemment eu la même question, et j'ai du traverser les interwebs à la recherche de réponses.

J'ai réussi à trouver cet article dans MSDN qui jette effectivement les bases. J'ai fini par combiner plusieurs des fichiers ici dans un seul exe qui contient toutes les commandes dont j'ai besoin, et ajouté dans ma propre méthode "void run()" qui boucle pour la vie entièrement du service pour mes propres besoins.

Ce serait un grand début à quelqu'un d'autre avec exactement cette question, donc pour les futurs chercheurs là-bas, vérifier:

Service complet Exemple http://msdn.microsoft.com/en-us/library/bb540476(VS.85).aspx

Questions connexes