Question

J'utilise VS6 et ATL avec CServiceModule pour implémenter un service Windows personnalisé. En cas d'erreur fatale, le service devrait s'arrêter lui-même. Comme CServiceModule est disponible via la variable _Module dans tous les fichiers, j’ai pensé à quelque chose comme ceci qui aurait provoqué CServiceModule :: Run pour qu’il arrête de pomper les messages et s’arrête tout seul

PostThreadMessage(_Module.dwThreadID, WM_QUIT, 0, 0);

Est-ce correct ou avez-vous une meilleure idée?

Était-ce utile?

La solution

Pour l’extinction automatique, vous envoyez la commande à Service Manager. Essayez cet exemple:


BOOL StopServiceCmd ( const char * szServiceName )
{ 
    SC_HANDLE schService; 
    SC_HANDLE schSCManager; 
    SERVICE_STATUS ssStatus;       // current status of the service 
    BOOL bRet;
    int iCont=0;

    schSCManager = OpenSCManager( 
        NULL, // machine (NULL == local) 
        NULL, // database (NULL == default) 
        SC_MANAGER_ALL_ACCESS // access required 
        ); 
    if ( schSCManager ) 
    { 
        schService = OpenService(schSCManager, szServiceName, SERVICE_ALL_ACCESS); 

        if (schService) 
        { 
            // try to stop the service 
            if ( ControlService( schService, SERVICE_CONTROL_STOP, &ssStatus ) ) 
            { 
                Sleep( 1000 ); 

                while( QueryServiceStatus( schService, &ssStatus ) ) 
                { 
                    iCont++;
                    if ( ssStatus.dwCurrentState == SERVICE_STOP_PENDING ) 
                    { 
                        Sleep( 1000 ); 
                        if ( iCont > 4 ) break;
                    } 
                    else 
                        break; 
                } 

                if ( ssStatus.dwCurrentState == SERVICE_STOPPED ) 
                    bRet = TRUE; 
                else 
                    bRet = FALSE; 
            } 

            CloseServiceHandle(schService); 
        } 
        else 
            bRet = FALSE; 

        CloseServiceHandle(schSCManager); 
    } 
    else 
        bRet = FALSE;

    return bRet;
} 

Autres conseils

Je pense que si vous le faites, le responsable du service pensera que votre service est tombé en panne et si l'utilisateur le configure pour un redémarrage automatique, il le fera.

Dans .NET, vous utilisez le ServiceController pour que votre service soit arrêté. Je suppose que c'est similaire dans Win32 puisque la plupart de ces choses dans .NET sont juste des wrappers Désolé, je n'ai pas le code C ++ à portée de main pour arrêter le service, mais voici le code .NET. J'espère que cela vous aidera à trouver l'information dont vous avez besoin sur Google ou à trouver la documentation dans MSDN.

Cela provient d'un code de suite de tests, d'où le style de vérification des erreurs;) Vous devrez placer ce code dans un thread pour que le message d'arrêt soit traité.

  private void stopPLService( bool close )
  {
     if ( m_serviceController == null )
     {
        m_serviceController = new ServiceController( "PLService" );
     }

     WriteLine( "StopPLService" );

     if ( m_serviceController != null )
     {
        try
        {
           m_serviceController.Stop();
        }
        catch
        {
           // Probably just means that it wasn't running or installed, ignore
        }

        // Wait up to 30 seconds for the service to stop
        try
        {
           m_serviceController.WaitForStatus( ServiceControllerStatus.Stopped, new TimeSpan( 0, 0, 30 ) );
        }
        catch ( System.ServiceProcess.TimeoutException )
        {
           Assert.Fail( "Timeout waiting for PLService to stop" );
        }
        catch
        {
           // Not installed, we only care in the start
        }
        if ( close )
        {
           m_serviceController.Close();
           m_serviceController = null;
        }
     }
  }

Vous voudrez probablement utiliser le service de contrôle ou ControlServiceEx méthodes pour arrêter votre service. Vous devriez pouvoir obtenir le descripteur requis à partir de CServiceModule.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top