Функция ServiceMain


Функция ServiceMain - это отправная точка для службы

Тип LPSERVICE_MAIN_FUNCTION определяет указатель на эту функцию обратного вызова. ServiceMain - метка - заполнитель для определяемого приложением имени функции.

Синтаксис

VOID WINAPI ServiceMain(
  DWORD dwArgc,
  LPTSTR* lpszArgv
);

Параметры

dwArgc

[in] Число параметров в массиве lpszArgv.

lpszArgv

[in] Указатель на массив указателей, которые -строки параметров с нулевым символом в конце. Первый параметр в массиве - имя службы, а последующие параметры - любые строки, которые передаются службе процессом, вызванным функцией StartService, чтобы запустить службу.

Возвращаемые значения

Эта функция не возвращает значений.

Замечания

Сервисная программа может запустить одну или несколько служб. Процесс службы получает структуру SERVICE_TABLE_ENTRY для каждой службы, которую он может запустить. Структура задает имя службы и указатель на функцию ServiceMain для этой службы.

Когда диспетчер управления службами получает запрос на запуск службы, он запускает процесс службы (если он еще не запускался). Главный поток процесса службы вызывает функцию StartServiceCtrlDispatcher с указателем на массив структур SERVICE_TABLE_ENTRY. Затем диспетчер управления службами отправляет запрос на запуск службы диспетчеру управления этого процесса службы. Диспетчер управления службой создает новый поток, являющийся начальным, чтобы исполнить код функции ServiceMain.

Функция ServiceMain должна немедленно вызвать функцию RegisterServiceCtrlHandlerEx, чтобы определить функцию HandlerEx, которая обработает запросы на управление. Затем, она должна вызвать функцию SetServiceStatus, чтобы отправить информацию о статусе диспетчеру управления службами. После этих вызовов, функция должна завершить инициализацию службы. Не попытайтесь запустить другую службу в функции ServiceMain.

Диспетчер управления службами (SCM) ждет до тех пор, пока  служба не сообщит о состоянии SERVICE_RUNNING. Это рекомендуется потому, что служба сообщает об этом состоянии как можно быстрее, пока другие компоненты в системе, которые требуют взаимодействия с Диспетчером управления службами (SCM), будут блокированы на это время. Некоторые функции могут требовать взаимодействия с Диспетчером управления службами (SCM) либо прямо, либо косвенно.

Диспетчер управления службами (SCM) блокирует сервисную базу данных управления в ходе инициализация, так как, если служба попытается назвать StartService в ходе инициализацией, то вызов блокируется. Когда служба сообщает Диспетчеру управления службами (SCM), что она успешно запустилась, то может вызвать StartService. Если служба требует, чтобы запустилась еще и другая служба, то служба должна установить требуемые зависимости.

Кроме того, Вы не должны вызывать какие-либо системные функций в ходе инициализации службы. Код службы должен вызывать системные функции только после того, как она сообщит о состоянии SERVICE_RUNNING.

Функция ServiceMain должна вызвать функцию RegisterWaitForSingleObject при событии и выключении программы. Это завершит работу потока, который запускается функцией ServiceMain, но не будет завершать работу службы. Сервисная обрабатывающая программа управления должна сообщить об этом событии, когда служба останавливается. Поток из пула потоков исполнит код, который выполняет очистку и вызывает функцию SetServiceStatus с флажком SERVICE_STOPPED.

Windows NT:  На более ранних платформах, где функция RegisterWaitForSingleObject не доступна, это - общая практика для потока, исполняющего код функции ServiceMain, чтобы ждать события, о котором сообщает сервисная обрабатывающая программа управления, когда служба останавливается. Когда о событии сообщают, то сама ServiceMain выполняет любую очистку и вызывает SetServiceStatus с SERVICE_STOPPED.

Демонстрационный код

Пример смотри в статье Запись функции ServiceMain.

Смотри также

Обзор Службы, Функции, используемые службамиHandlerEx, RegisterServiceCtrlHandlerEx, RegisterWaitForSingleObject, SetServiceStatus, SERVICE_TABLE_ENTRY, StartServiceCtrlDispatcher

Размещение и совместимость ServiceMain

К Windows XP Да 
л Windows 2000 Professional Да
и Windows NT  Workstation Да 
е Windows Me Да
н Windows 98 Да
т Windows 95 Да
 
С Windows Server 2003 Да
е Windows 2000 Server Да
р Windows NT Server Да 
в    
е    
р    
Используемая библиотека -
Используемая DLL -
 Заголовочный файл  
- объявлено в Winsvc.h
 - включено в Windows.h
 Unicode Нет
 Замечания по платформе Не имеется

 

Назад в оглавление
На главную страницу
На оглавление справки

Hosted by uCoz