Программирование для Windows NT (том 2)

       

Функция 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.



Содержание раздела