2011-03-11 3 views
2

J'ai écrit Windows Service dans VC++ pour monter des lecteurs au redémarrage du système. Maintenant, lorsque je redémarre le système, à l'arrêt du système, je veux déclencher mon événement d'arrêt de service qui ne se déclenche pas.Comment faire pour déclencher l'événement Arrêt du service Windows au redémarrage du système?

J'ai défini les propriétés du service Windows comme étant automatiques mais cela ne fonctionne pas. Lorsque je clique manuellement sur l'événement d'arrêt du bouton d'arrêt, je suis renvoyé.

Toute aide est appréciée. Mon code ressemble à:

void WINAPI ServiceCtrlHandler(DWORD Opcode) 
{ 
    switch(Opcode) 
    { 
    case SERVICE_CONTROL_PAUSE: 
     m_ServiceStatus.dwCurrentState = SERVICE_PAUSED; 
     break; 
    case SERVICE_CONTROL_CONTINUE: 
     m_ServiceStatus.dwCurrentState = SERVICE_RUNNING; 
     break; 
    case SERVICE_CONTROL_STOP: 
     m_ServiceStatus.dwWin32ExitCode = 0; 
     m_ServiceStatus.dwCurrentState = SERVICE_STOPPED; 
     m_ServiceStatus.dwCheckPoint = 0; 
     m_ServiceStatus.dwWaitHint = 0; 

    Disconnect() ;// This method i want to get called on system shot down automatically. 

     SetServiceStatus (m_ServiceStatusHandle,&m_ServiceStatus); 
     bRunning=false; 
     break; 
    case SERVICE_CONTROL_INTERROGATE: 
     break; 
    } 
    return; 
} 

Répondre

2

Ceci est relativement simple. Gérez le SERVICE_CONTROL_SHUTDOWN de votre fonction de gestionnaire de rappel en ajoutant un autre cas à l'instruction switch. Probablement quelque chose comme:

void WINAPI ServiceCtrlHandler(DWORD Opcode) 
{ 
    switch(Opcode) 
    { 
    case SERVICE_CONTROL_PAUSE: 
     m_ServiceStatus.dwCurrentState = SERVICE_PAUSED; 
     break; 
    case SERVICE_CONTROL_CONTINUE: 
     m_ServiceStatus.dwCurrentState = SERVICE_RUNNING; 
     break; 
    case SERVICE_CONTROL_STOP: 
     m_ServiceStatus.dwWin32ExitCode = 0; 
     m_ServiceStatus.dwCurrentState = SERVICE_STOPPED; 
     m_ServiceStatus.dwCheckPoint = 0; 
     m_ServiceStatus.dwWaitHint = 0; 

    Disconnect() ;// This method i want to get called on system shot down automatically. 

     SetServiceStatus (m_ServiceStatusHandle,&m_ServiceStatus); 
     bRunning=false; 
     break; 
    case SERVICE_CONTROL_INTERROGATE: 
     break; 

    case SERVICE_CONTROL_SHUTDOWN: 
     Disconnect(); 
     break; 
    } 
    return; 
} 

OU:

Au lieu d'enregistrer la fonction de rappel avec RegisterServiceCtrlHandler utiliser RegisterServiceCtrlHandlerEx. Cette nouvelle méthode de rappel est préférée. La signature de votre fonction de rappel doit correspondre à HandlerEx, see MSDN for more info.

DWORD WINAPI HandlerEx(
    __in DWORD dwControl, 
    __in DWORD dwEventType, 
    __in LPVOID lpEventData, 
    __in LPVOID lpContext 
); 

Ajouter un autre cas à votre instruction switch, soit SERVICE_CONTROL_PRESHUTDOWN (non disponible sur XP/Server 2003) ou SERVICE_CONTROL_SHUTDOWN, lisez les avertissements au sujet de la manipulation de ces notifications dans la documentation HandlerEx mentionné ci-dessus.

Questions connexes