Отладка приложений

       

Использование API-функций


Службы обладают рядом уникальных свойств, и от вас потребуются некоторые усилия, чтобы к ним приспособиться. Во-первых, точка входа, которая используется в службах — main или winMain — не имеет особого значения. Поскольку служба не программирует пользовательского интерфейса, то вы можете использовать как одну, так и другую.

 UPS — Uninterruptible Power Supply. — Пер.

С этих функций начинается выполнение Windows-приложений. Функция main является консольной точкой входа, a WinMain — точкой входа графического интерфейса пользователя (GUI). - Пер.

Внутри функций main и winMain прежде всего нужно обратиться к API-функции startServiceCtrlDispatcher. При этом ей следует передать структуру SERVICE_TABLE_ENTRY, в которой нужно указать  имя и главную точку входа службы. Диспетчер управления службами (Service Control Manager — SCM), который запускает все службы и с которым, в конечном счете, общается StartServiceCtrlDispatcher (для того чтобы установить вашу службу), является средством операционной системы, которое, судя по его названию, управляет всеми службами. Если служба не вызывает функцию StartServiceCtrlDispatcher в течение 2 минут (для Windows NT 4) или 30 секунд (для Windows 2000) после своего запуска, то SCM завершает эту службу. Как будет показано чуть позже, этот лимит времени может определенным образом влиять на запуск отладчика.

Как только выполняется обращение к SCM-менеджеру, он порождает поток для вызова точки входа вашей службы. С этой точкой входа связано одно жесткое Требование: она должна вызвать функцию RegisterServiceCtrlHandler в течение 1 секунды после старта службы. Если вызов не последует в течение 1 секунды, SCM подумает, что служба потерпела неудачу, но не завершитее. ЕСЛИ служба, В Конечном счете, Вызывает RegisterServiceCtrlHandler, то она будет выполняться нормально. На первый взгляд, было бы логично, если бы диспетчер SCM завершил службу, заподозрив, что она закончилась неудачей, на самом деле он этого не делает. Преимуществом такого поведения является то, что значительно облегчается отладка, поскольку служба продолжает выполняться.


Функция RegisterServiceCtrlHandler получает еще и другой указатель — на функцию, называемую функцией обработчика (handler function). SCM обращается к этой функции для того, чтобы управлять производительностью службы на таких операциях, как остановка, приостановка (пауза) или продолжение выполнения.

Когда служба переходит в состояния старта, остановки и приостановки, она связывается с SCM через API-функцию setservicestatus. Большинство служб должны просто вызвать setservicestatus и указать основное состояние, в которое они переходят, так что в этой API-функции нет ничего необычного.

Некоторые детали, связанные с API-функциями, опущены, но в основном обращения к  StartServiceCtrlDispatcher, RegisterServiceCtrlHandler И setservicestatus — это все, что операционная система требует от вашей службы для ее запуска и выполнения. Заметьте, что ничего не сказано о требованиях к протоколам обмена, с помощью которых служба связывается пользовательским интерфейсом контроллера, который вы пишете. К счастью, службы имеют доступ ко всем регулярным API-функциям Windows, поэтому возможно использование файлов, отображаемых в память, почтовых ячеек и именованных каналов. Службы предоставляют все возможности для организации нормальных связей между процессами. Наиболее трудной проблемой, связанной со службами, является безопасность.



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