Функция main сервисного процесса
В простейшем случае функция main вызывает функцию StartServiceCtrlDispatcher, что необходимо для подключения главной задачи сервисного процесса к процессу управления сервисами. Ниже мы привели пример функции main сервисного процесса:
#define MYServiceName "Sample of simple service"
void main(int agrc, char *argv[])
{
SERVICE_TABLE_ENTRY DispatcherTable[] =
{
{
MYServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain
},
{
NULL, NULL
}
};
if(!StartServiceCtrlDispatcher(DispatcherTable))
{
fprintf(stdout,"StartServiceCtrlDispatcher: Error %ld\n",
GetLastError());
getch();
return;
}
}
Функции StartServiceCtrlDispatcher передается указатель на массив структур типа SERVICE_TABLE_ENTRY. В этом массиве описываются точки входа всех сервисов, определенных в данном файле. Таким образом, в одном файле можно определить сразу несколько сервисов. Последняя строка таблицы всегда должна содержать значения NULL - это признак конца таблицы.
Тип SERVICE_TABLE_ENTRY и соответствующий указатель определены следующим образом:
typedef struct _SERVICE_TABLE_ENTRY
{
LPTSTR lpServiceName;
LPSERVICE_MAIN_FUNCTION lpServiceProc;
} SERVICE_TABLE_ENTRY, *LPSERVICE_TABLE_ENTRY;
В поле lpServiceName записывается указатель на текстовую строку имени сервиса, а в поле lpServiceProc - указатель на точку входа сервиса.
Заметим, что функция main должна вызвать функцию StartServiceCtrlDispatcher достаточно быстро - не позднее чем через 30 секунд после запуска.
Получив управление, функция StartServiceCtrlDispatcher не возвращает его до тех пор, пока все сервисы, запущенные в рамках данного процесса, не завершат свою работу.
При успешном завершении функция StartServiceCtrlDispatcher возвращает значение TRUE. Если же произойдет ошибка, возвращается значение FALSE. Код ошибки можно определить при помощи функции GetLastError.