Программирование для 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.




- Начало -  - Назад -  - Вперед -