Структура приложений-служб Windows

октября 12 2009 by admin in Службы

Здесь я опишу дополнительную инфраструктуру, которая превращает серверное приложение в службу, благодаря чему вашим серверным приложением можно управлять удаленно. Поначалу архитектура служб Microsoft показалась мне несколько сложной для понимания. Сложность объясняется тем, что каждый процесс службы всегда имеет хотя бы два потока и потоки эти должны взаимодействовать. Так что приходится иметь дело с синхронизацией потоков и обменом информацией между ними.
Следует также учитывать возможность наличия нескольких служб в одном исполняемом файле. Многие службы содержатся в Services.exe . и большинство из них (такие как DHCP Client, Messenger и Alerter) реализованы довольно просто. Было бы весьма расточительно запускать для каждой из этих служб отдельный процесс с его собственным адресным пространством и дополнительными накладными расходами, связанными с каждым процессом. Чтобы избежать этого, Microsoft позволяет одному исполняемому файлу содержать несколько служб. Вообще в файле Services.exe содержится около 20 служб, включая три указанные.
Проектируя службу, прежде всего обратите внимание на три вида функций.
Основная функция процесса — стандартная функция (iv)main или (w)Win-Main, с которой вы уже хорошо знакомы. В службах она инициализирует процесс в целом и затем вызывает специальные функции, которые связывают процесс с SCM локальной системы. Теперь SCM управляет вашим основным потоком для собственных нужд. Ваш код снова получит управление, только когда все службы из исполняемого файла прекратят работу.
Функция ServiceMain службы — это функция, которую нужно реализовать для каждой службы исполняемого файла. Чтобы запустить службу, SCM порождает в вашем процессе поток, который выполняет функцию Sewice-Main. Когда управление в потоке возвращается из ServiceMain, SCM решает, что служба остановлена. Заметьте: эта функция не обязательно должна называться ServiceMain — вы вправе назвать ее как угодно.
Функция HandlerEx службы — каждая служба должна иметь связанную с ней функцию HandlerEx. SCM взаимодействует со службой, вызывая ее функцию HandlerEx. Ее код выполняется в основном потоке процесса. HandlerEx или выполняет нужные действия, или, применяя ту или иную форму межпотокового взаимодействия, должна взаимодействовать с той частью потока, управляемого SCM, который выполняет функцию ServiceMain службы. Каждая служба может иметь собственную HandlerEx иди несколько служб (объединенных одним исполняемым файлом) могут совместно использовать единственную HandlerEx. Один из параметров HandlerEx указывает службу, с которой желает взаимодействовать SCM. Эта функция не обязательно должна называться HandlerEx — вы вправе назвать ее как угодно.
Выше показаны функции, необходимые для реализации исполняемого файла, содержащего две службы, а также пути межпроцессного взаимодействия (IPC, interprocess communication) и межпотокового взаимодействия (ITC, interthread communication). Далее мы подробно рассмотрим эти три функции.