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


Точка входа службы

Службы обычно записываются как консольные приложения. Точкой входа консольного приложения является его main функция. Функция main получает аргументы из значения ImagePath из раздела реестра для службы. Дополнительные сведения см. в разделе Примечания функции CreateService .

Когда SCM запускает программу-службу, она ожидает, пока она вызовет функцию StartServiceCtrlDispatcher . Используйте следующие рекомендации.

  • Служба типа SERVICE_WIN32_OWN_PROCESS должна немедленно вызывать StartServiceCtrlDispatcher из main потока. После запуска службы можно выполнить любую инициализацию, как описано в разделе ServiceMain Function.
  • Если тип службы SERVICE_WIN32_SHARE_PROCESS и есть общая инициализация для всех служб в программе, вы можете выполнить инициализацию в потоке main перед вызовом StartServiceCtrlDispatcher, если это займет менее 30 секунд. В противном случае необходимо создать другой поток для выполнения общей инициализации, а поток main вызывает StartServiceCtrlDispatcher. После запуска службы по-прежнему следует выполнять инициализацию для конкретной службы.

Функция StartServiceCtrlDispatcher принимает SERVICE_TABLE_ENTRY структуру для каждой службы, содержащейся в процессе. Каждая структура указывает имя службы и точку входа для службы. Пример см. в статье Написание функции main программы-службы.

Если startServiceCtrlDispatcher завершается успешно, вызывающий поток не возвращается до тех пор, пока все запущенные в процессе службы не перешлы в состояние SERVICE_STOPPED. SCM отправляет запросы управления в этот поток через именованный канал. Поток выступает в качестве диспетчера управления, выполняя следующие задачи:

  • Создайте новый поток для вызова соответствующей точки входа при запуске новой службы.
  • Вызовите соответствующую функцию обработчика для обработки запросов на управление службами.

Написание функции main служебной программы