Как запустить событие остановки службы Windows при перезагрузке системы? - PullRequest
2 голосов
/ 11 марта 2011

Я написал Windows Service в VC ++ для монтирования дисков при перезагрузке системы. Теперь, когда я перезагружаю систему, при выключении системы я хочу запустить событие остановки службы, которое не запускается.

Я установил свойства службы Windows как автоматические, но они не работают. Когда я вручную нажимаю кнопку «Стоп», событие «Стоп» запускается.

Любая помощь приветствуется. Мой код выглядит так:

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

1 Ответ

2 голосов
/ 05 июня 2011

Это относительно просто. Либо обработайте SERVICE_CONTROL_SHUTDOWN в текущей функции обработчика обратного вызова, добавив еще один случай в оператор switch. Возможно что-то вроде:

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

OR

Вместо регистрации функции обратного вызова с помощью RegisterServiceCtrlHandler используйте RegisterServiceCtrlHandlerEx. Этот новый метод обратного вызова является предпочтительным. Подпись вашей функции обратного вызова должна соответствовать HandlerEx, для получения дополнительной информации см. MSDN .

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

Добавьте еще один случай в оператор switch: SERVICE_CONTROL_PRESHUTDOWN (недоступно в XP / Server 2003) или SERVICE_CONTROL_SHUTDOWN, ознакомьтесь с предупреждениями об обработке этих уведомлений в документации HandlerEx, упомянутой выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...