zoukankan      html  css  js  c++  java
  • Writing a ServiceMain Function(使用RegisterServiceCtrlHandler函数)

    The following global definitions are used in this sample.

     
    #define SVCNAME TEXT("SvcName")
    
    SERVICE_STATUS          gSvcStatus; 
    SERVICE_STATUS_HANDLE   gSvcStatusHandle; 
    HANDLE                  ghSvcStopEvent = NULL;
    
    
    

    The following sample fragment is taken from the complete service sample.

     
    //
    // Purpose: 
    //   Entry point for the service
    //
    // Parameters:
    //   dwArgc - Number of arguments in the lpszArgv array
    //   lpszArgv - Array of strings. The first string is the name of
    //     the service and subsequent strings are passed by the process
    //     that called the StartService function to start the service.
    // 
    // Return value:
    //   None.
    //
    VOID WINAPI SvcMain( DWORD dwArgc, LPTSTR *lpszArgv )
    {
        // Register the handler function for the service
    
        gSvcStatusHandle = RegisterServiceCtrlHandler( 
            SVCNAME, 
            SvcCtrlHandler);
    
        if( !gSvcStatusHandle )
        { 
            SvcReportEvent(TEXT("RegisterServiceCtrlHandler")); 
            return; 
        } 
    
        // These SERVICE_STATUS members remain as set here
    
        gSvcStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; 
        gSvcStatus.dwServiceSpecificExitCode = 0;    
    
        // Report initial status to the SCM
    
        ReportSvcStatus( SERVICE_START_PENDING, NO_ERROR, 3000 );
    
        // Perform service-specific initialization and work.
    
        SvcInit( dwArgc, lpszArgv );
    }
    
    //
    // Purpose: 
    //   The service code
    //
    // Parameters:
    //   dwArgc - Number of arguments in the lpszArgv array
    //   lpszArgv - Array of strings. The first string is the name of
    //     the service and subsequent strings are passed by the process
    //     that called the StartService function to start the service.
    // 
    // Return value:
    //   None
    //
    VOID SvcInit( DWORD dwArgc, LPTSTR *lpszArgv)
    {
        // TO_DO: Declare and set any required variables.
        //   Be sure to periodically call ReportSvcStatus() with 
        //   SERVICE_START_PENDING. If initialization fails, call
        //   ReportSvcStatus with SERVICE_STOPPED.
    
        // Create an event. The control handler function, SvcCtrlHandler,
        // signals this event when it receives the stop control code.
    
        ghSvcStopEvent = CreateEvent(
                             NULL,    // default security attributes
                             TRUE,    // manual reset event
                             FALSE,   // not signaled
                             NULL);   // no name
    
        if ( ghSvcStopEvent == NULL)
        {
            ReportSvcStatus( SERVICE_STOPPED, NO_ERROR, 0 );
            return;
        }
    
        // Report running status when initialization is complete.
    
        ReportSvcStatus( SERVICE_RUNNING, NO_ERROR, 0 );
    
        // TO_DO: Perform work until service stops.
    
        while(1)
        {
            // Check whether to stop the service.
    
            WaitForSingleObject(ghSvcStopEvent, INFINITE);
    
            ReportSvcStatus( SERVICE_STOPPED, NO_ERROR, 0 );
            return;
        }
    }
    
    //
    // Purpose: 
    //   Sets the current service status and reports it to the SCM.
    //
    // Parameters:
    //   dwCurrentState - The current state (see SERVICE_STATUS)
    //   dwWin32ExitCode - The system error code
    //   dwWaitHint - Estimated time for pending operation, 
    //     in milliseconds
    // 
    // Return value:
    //   None
    //
    VOID ReportSvcStatus( DWORD dwCurrentState,
                          DWORD dwWin32ExitCode,
                          DWORD dwWaitHint)
    {
        static DWORD dwCheckPoint = 1;
    
        // Fill in the SERVICE_STATUS structure.
    
        gSvcStatus.dwCurrentState = dwCurrentState;
        gSvcStatus.dwWin32ExitCode = dwWin32ExitCode;
        gSvcStatus.dwWaitHint = dwWaitHint;
    
        if (dwCurrentState == SERVICE_START_PENDING)
            gSvcStatus.dwControlsAccepted = 0;
        else gSvcStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
    
        if ( (dwCurrentState == SERVICE_RUNNING) ||
               (dwCurrentState == SERVICE_STOPPED) )
            gSvcStatus.dwCheckPoint = 0;
        else gSvcStatus.dwCheckPoint = dwCheckPoint++;
    
        // Report the status of the service to the SCM.
        SetServiceStatus( gSvcStatusHandle, &gSvcStatus );
    }

    In the following example, the SvcCtrlHandler function is an example of a Handler function. Note that the ghSvcStopEvent variable is a global variable that should be initialized and used as demonstrated in Writing a ServiceMain function.

     
    //
    // Purpose: 
    //   Called by SCM whenever a control code is sent to the service
    //   using the ControlService function.
    //
    // Parameters:
    //   dwCtrl - control code
    // 
    // Return value:
    //   None
    //
    VOID WINAPI SvcCtrlHandler( DWORD dwCtrl )
    {
       // Handle the requested control code. 
    
       switch(dwCtrl) 
       {  
          case SERVICE_CONTROL_STOP: 
             ReportSvcStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);
    
             // Signal the service to stop.
    
             SetEvent(ghSvcStopEvent);
             ReportSvcStatus(gSvcStatus.dwCurrentState, NO_ERROR, 0);
             
             return;
     
          case SERVICE_CONTROL_INTERROGATE: 
             break; 
     
          default: 
             break;
       } 
       
    }
    
    


    https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms687414(v=vs.85).aspx
    http://bbs.2ccc.com/topic.asp?topicid=510075
  • 相关阅读:
    ES6 Set
    JavaScript 之 对象属性的特性 和defineProperty方法
    ES6 ... 展开&收集运算符
    ES6 箭头函数
    ES6 解构 destructuring
    canvas之事件交互效果isPointPath
    跨域及JSONP原理
    P03 显示隐藏
    最长公共子序列
    P02 CSS样式
  • 原文地址:https://www.cnblogs.com/findumars/p/5494557.html
Copyright © 2011-2022 走看看