Книга: Системное программирование в среде Windows
Функция main()
Функция main()
Задачей новой функции main(), которая вызывается SCM, является регистрация службы в SCM и запуск диспетчера службы (service control dispatcher). Для этого необходимо вызвать функцию StartServiceControlDispatcher, передав ей имя (имена) и точку (точки) входа одной или нескольких логических служб.
BOOL StartServiceCtrlDispatcher(LPSERVICE_TABLE_ENTRY lpServiceStartTable)
Эта функция принимает единственный аргумент lpServiceStartTable, являющийся адресом массива элементов SERVICE_TABLE_ENTRY, каждый из которых представляет имя и точку входа логической службы. Конец массива обозначается двумя последовательными значениями NULL.
Функция возвращает значение TRUE, если регистрация службы прошла успешно. Если служба уже выполняется или возникают проблемы с обновлением записей реестра (HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices), функция завершается с ошибками, обработка которых может осуществляться обычным путем.
Основной поток процесса службы, которая вызывает функцию StartService-ControlDispatcher, связывает поток с SCM. SCM регистрирует службу с вызывающим потоком в качестве потока диспетчера службы. SCM не осуществляет возврата в вызывающий поток до тех пор, пока не завершат выполнение все службы. Заметьте, однако, что фактического запуска логических служб в этот момент не происходит; запуск службы требует вызова функции StartService, которая описывается далее в этой главе.
Типичная основная программа службы, соответствующая случаю единственной логической службы, представлена в программе 13.1.
Программа 13.1. main: точка входа main службы
#include "EvryThng.h"
void WINAPI ServiceMain(DWORD argc, LPTSTR argv[]);
static LPTSTR ServiceName = _T("SocketCommandLineService");
/* Главная программа запуска диспетчера службы. */
VOID _tmain(int argc, LPTSTR argv[]) {
SERVICE_TABLE_ENTRY DispatchTable[] = {
{ ServiceName, ServiceMain },
{ NULL, NULL }
};
if (!StartServiceCtrlDispatcher(DispatchTable)) ReportError(_T("Ошибка при запуске диспетчера службы."), 1, TRUE);
/* ServiceMain() начнет выполняться только после того, как ее */
/* запустит SCM. Возврат сюда осуществляется только после того, */
/* как завершится выполнение всех служб. */
return;
}
- Написание программ, реализующихслужбы Windows Services: обзор
- Функция main()
- Функции ServiceMain()
- Обработчик управляющих команд службы
- Пример: "интерфейсная оболочка" службы
- Управление службами Windows
- Резюме: функционирование и управление службой
- Пример:команднаяоболочкауправленияслужбами
- Совместное использование объектов ядра приложениями и службами
- Регистрация событий
- Замечания по отладке службы
- Резюме
- Упражнения
- Функция strcmp( )
- 5.3. Эхо-сервер TCP: функция str_echo
- Обобщенная функция Main
- Листинг 4.3. Исправленная функция main() из файла thread-create.c
- Листинг 11.5. (main.c) Главная серверная функция, выполняющая анализ аргументов командной строки
- 10.2. Потоковый эхо-сервер SCTP типа «один-ко-многим»: функция main
- 5.2. Эхо-сервер TCP: функция main
- 8.3. Эхо-сервер UDP: функция main
- 10.3. Потоковый эхо-клиент SCTP типа «один-ко-многим»: функция main
- 5.4. Эхо-клиент TCP: функция main
- 8.5. Эхо-клиент UDP: функция main
- 3. Функции