Поделиться через


Написание функции обработчика элементов управления

Когда функцияобработчикавызывается потоком диспетчера, она обрабатывает управляющий код, переданный в параметре Opcode, а затем вызывает функцию ReportSvcStatus для обновления состояния службы. Когда функция обработчика получает код элемента управления, он должен сообщать о состоянии службы только в том случае, если обработка кода элемента управления приводит к изменению состояния службы. Если служба не взаимодействует с элементом управления, она не должна сообщать о состоянии диспетчеру управления службами. Исходный код для ReportSvcStatus см. в разделе Создание функции ServiceMain.

В следующем примере функция SvcCtrlHandler является примером функции Обработчика. Обратите внимание, что переменная ghSvcStopEvent — это глобальная переменная, которую следует инициализировать и использовать, как показано в записи функции ServiceMain.

//
// 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;
   } 
   
}

функции обработчика управления службами

Полный образец услуги