Написание программ, реализующихслужбы Windows Services: обзор

Службы Windows производятся под управлением диспетчера управления службами (Service Control Manager, SCM). Преобразование консольного приложения, такового как serverNP либо serverSK, в службу Windows осуществляется в три шага, после выполнения которых программка перебегает под управление SCM.

1. Создание новейшей точки входа main(), которая регистрирует службу в SCM, предоставляя точки входа и имена логических Написание программ, реализующихслужбы Windows Services: обзор служб.

2. Преобразование прежней функции точки входа main() в функцию ServiceMain (), которая регистрирует обработчик управляющих команд службы и информирует SCM о собственном состоянии. Остальная часть кода, по существу, сохраняет прежний вид, хотя и может быть дополнена командами регистрации событий. Имя ServiceMain () является заменителем имени логической службы, при этом логических служб Написание программ, реализующихслужбы Windows Services: обзор может быть несколько.

3. Написание функции обработчика управляющих команд службы, которая должна решать определенные деяния в ответ на команды, поступающие от SCM.

По мере описания каждого из этих 3-х шагов будут даваться отдельные объяснения, касающиеся сотворения служб, их пуска и управления ими. Более подробные сведения приводятся в следующих разделах, а Написание программ, реализующихслужбы Windows Services: обзор взаимодействие меж отдельными компонентами службы иллюстрируется на рис. 13.1 дальше в этой главе.

Функция main()

Задачей новейшей функции main(), которая вызывается SCM, является регистрация службы в SCM и пуск диспетчера службы (service control dispatcher). Для этого нужно вызвать функцию StartServiceControlDispatcher, передав ей имя (имена) и точку (точки) входа Написание программ, реализующихслужбы Windows Services: обзор одной либо нескольких логических служб.

BOOL StartServiceCtrlDispatcher(LPSERVICE_TABLE_ENTRY lpServiceStartTable )

Эта функция воспринимает единственный аргумент lpServiceStartTable, являющийся адресом массива частей SERVICE_TABLE_ENTRY, любой из которых представляет имя и точку входа логической службы. Конец массива обозначается 2-мя поочередными значениями NULL.

Функция возвращает значение TRUE, если регистрация службы прошла Написание программ, реализующихслужбы Windows Services: обзор удачно. Если служба уже производится либо появляются трудности с обновлением записей реестра (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services), функция заканчивается с ошибками, обработка которых может осуществляться обыденным методом.

Основной поток процесса службы, которая вызывает функцию StartService-ControlDispatcher, связывает поток с SCM. SCM регистрирует службу с вызывающим потоком в качестве потока диспетчера Написание программ, реализующихслужбы Windows Services: обзор службы. SCM не производит возврата в вызывающий поток до того времени, пока не окончят выполнение все службы. Заметьте, но, что фактического пуска логических служб в этот момент не происходит; пуск службы просит вызова функции StartService, которая описывается дальше в этой главе.

Обычная основная программка службы, соответственная случаю единственной Написание программ, реализующихслужбы Windows Services: обзор логической службы, представлена в программке 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 Написание программ, реализующихслужбы Windows Services: обзор(_T("Ошибка при запуске диспетчера службы."), 1, TRUE);

/* ServiceMain() начнет производиться только после того, как ее */

/* запустит SCM. Возврат сюда осуществляется только после того, */

/* как закончится выполнение всех служб. */

return;

}

Функции ServiceMain()

Эти функции, которые указываются в таблице диспетчеризации, фигурирующей в программке 13.1, представляют логические службы. На самом деле, эти функции являются улучшенными Написание программ, реализующихслужбы Windows Services: обзор версиями основной программки, преобразуемой в службу, и любая логическая служба будет активизироваться в ее своем потоке SCM. В свою очередь, логическая служба может запускать дополнительные потоки, к примеру, рабочие потоки сервера, которые использовались в программках serverSK и serverNP. Нередко снутри службы существует только одна логическая служба. Логическая Написание программ, реализующихслужбы Windows Services: обзор служба в программке 13.2 получена методом соответственной адаптации основного сервера из программки 12.2. В то же время, логические службы на базе сокетов и именованных каналов могут производиться в рамках одной и той же службы Windows, что востребует предоставления главных функций обеих служб.

Невзирая на то что функция ServiceMain () является приспособленным вариантом функции main Написание программ, реализующихслужбы Windows Services: обзор() с ее параметрами, представляющими количество аргументов и содержащую их строчку, меж ними имеется одно малозначительное отличие: функция службы должна быть объявлена с типом void, а не иметь возвращаемое значение типа int, как в случае обыкновенной функции main().

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


namereniya-i-veroyatnij-kurs-dejstvij-protivnika.html
namestnik-genialissimusa-vladimir-vojnovich-moskva-2042.html
namibiya.html