Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы Мартын 1(ComCorbaLab2004).doc
Скачиваний:
30
Добавлен:
10.02.2016
Размер:
1.81 Mб
Скачать

4.1.13 Структура службы nt

Все службы WindowsNTдолжны выполнять две стандартные функции, предназначенные для взаимодействия с диспетчеромSCM. При запуске службы, как и в обычном исполняемом модуле, вызывается функцияmain() илиWinMain(). Но, в отличие от обычного исполняемого модуля, эта функция вызывает функциюStartServiceCtrlDispatcher() библиотекиAPI, информирующую диспетчерSCM обо всех службах в исполняемом модуле. Единственный исполняемый модуль может содержать несколько служб. ДиспетчерSCMдля запуска каждой службы использует функциюServiceMain(). Когда вызывается функцияServiceMain(), она сама себя запускает (например, начинает исполнение цикла обработки сообщений).

Диспетчер SCMвзаимодействует со службой во время ее исполнения, отдает ей команды, напримерStop(Стоп) илиPause(Пауза) с помощью функции обработчика (handlerfunction), зарегистрированной диспетчеромSCM, использующимAPI-функциюRegisterServiceCtrlHandler(). ФункцияServiceMain() обеспечивает вызов этойAPI-функцииперед запуском службы. После установления этой псевдосвязи между службой иSCMдиспетчерSCMможет вызывать функцию обработчика, предписывая службе остановиться. Служба останавливает исполнение и возвращает сообщение (например, отправив сообщениеWM_QUITв исполняемый поток).

4.1.14 Основанный на службах nt сервер сом

Для демонстрации построения серверов СОМ на основе служб Windows NT можно построить простой, но мощный механизм кэширования данных по запуску системы и использования кэша для ответов на запросы клиентов. Чтобы уделить внимание самой концепции, можно жестко закодировать данные, которые нужно кэшировать, возможно использовать указанный механизм для кэширования данных, поступающих от сервера базы данных, например Microsoft SQL Server.

4.1.15 Создание проекта при помощи atl

Начать можно с создания проекта ATL COM AppWizard, выбрав в группе переключателей Server Type (Тип сервера) опцию Service (EXE) и щелкнув на кнопке Finish. Полученная служба может выполнять лишь запуск и остановку. Перед добавлением к ней собственных функциональных средств, стоит ознакомиться с файлами и программным кодом, сгенерированными мастером.

Мастер генерирует стандартный файл IDL, ресурсный файл и интересный стандартный включаемый файл StAfx.h. Он содержит объявление нему 16 функций-членов и пять переменных-членов. Все, что эти добавленные функции должны делать, это регистрация и отмена регистрации сервера, а также обеспечение взаимодействия с диспетчером SCM и выполнение обычных служебных функций (запуск и остановка).

Функция, в которой все наиболее заинтересованы, – ServiceMain(). Она вызывается диспетчером SCM, когда требуется запустить и остановить службу, функция ServiceMain() вызывает функцию RegisterServiceCtrlHandler, которая информирует SCM о функции обработчика службы. Для выполнения полезной работы диспетчер вызывает функцию CServiceModule::Run().

В функции Run() происходят интересные вещи. Во-первых, инициализация средств СОМ вызовом функции Colnitialize(). Здесь имеется несколько операторов, которые работают с дескрипторами защиты (security descriptor) и функцией CoInitializeSecurity. Пока достаточно знать, что данный программный код устанавливает защиту на сервере так, что обратиться к нему может каждый. Это хорошо для простейшего приложения, но неприемлемо для приложения, предназначенного для реального использования.

Установив систему защиты, можно вызывать функцию CComModule::RegisterClassObjects. Для внепроцессорных серверов требуется регистрация классов с помощью системной таблицы классов (system class table). Для этого метод CComModule::RegisterClassObject предоставляет стандартную реализацию кода.

Вызов функции LogEvent() – это другая функция-член, сгенерированная мастером, обеспечивающая регистрацию сообщений в журнале событий Windows NT. Она удобна для передачи сообщений о состоянии служб и отладки сообщений. Установив состояния служб как SERVICE_RUNNING, функция входит в цикл обработки сообщений, который прекращается по вызову функции обработчика, указывающего службе остановиться.

Диспетчер SCM вызывает зарегистрированную функцию обработчика службы (функция _Handler), передав службе какую-либо команду, например Stop (Стоп). Функция _Handler является статической функцией-членом, которая выполняет свою работу и вызывает функцию Handler - нестатическую функцию-член. Если переданная команда – SERVICE_CONTROL_STOP, то Handler отправляет сообщение WM_QUIT исполняемой службе, что приводит к ее останову. Остальные функции-члены класса CServiceModule не содержат новых концепций.

Помимо класса CServceModule здесь имеется глобальная функция _tWinMain. Это главная функция исполняемого модуля, вызываемая при его запуске. Функция анализирует командную строку и выполняет соответствующие действия. Надо запустить исполняемый модуль и передать ему параметр /Service, чтобы зарегистрировдть его как службу с помощью диспетчера SCM. Теперь нужно добавить к этой службе собственные функциональные средства.