Пример: "интерфейсная оболочка" службы

Пример: "интерфейсная оболочка" службы

Программа 13.2 реализует преобразованный вариант программы serverSK, который мы перед этим обсуждали. Преобразование сервера в службу сопряжено с решением всех ранее описанных задач. После внесения незначительных изменений существующий код сервера помещается в функцию ServiceSpecific. Поэтому представленный ниже код, по сути, является оболочкой (wrapper) существующей программы сервера, точка входа которой main заменена на ServiceSpecifiс.

Другим дополнением, которое здесь не представлено, но включено в вариант программы, находящийся на Web-сайте книги, является использование журнала службы, поскольку службы часто запускаются без интерактивной консоли, никак себя видимо не проявляя. 

Программа 13.2. SimpleService: оболочка службы 

/* Глава 13. serviceSK.c

   Преобразование сервера serverSK в службу Windows.

   Несмотря на рассмотрение частного случая, оболочка имеет универсальный характер. */

#include "EvryThng.h"

#include "ClntSrvr.h"

#define UPDATE_TIME 1000 /* Интервал обновления – 1 секунда. */

VOID LogEvent(LPCTSTR, DWORD, BOOL);

void WINAPI ServiceMain(DWORD argc, LPTSTR argv[]);

VOID WINAPI ServerCtrlHandlerEx(DWORD; DWORD, LPVOID, LPVOID);

void UpdateStatus (int, int); /* Вызывает, функцию SetServiceStatus. */

int ServiceSpecific (int, LPTSTR *); /* Ранее программа main. */

volatile static BOOL ShutDown = FALSE, PauseFlag = FALSE;

static SERVICE_STATUS hServStatus;

static SERVICE_STATUS_HANDLE hSStat; /* Дескриптор, используемый при установке состояния. */

static LPTSTR ServiceName = _T("SocketCommandLineService");

static LPTSTR LogFileName = _T("CommandLineServiceLog.txt");

/* Основная процедура, запускающая диспетчер управления службой. */

VOID _tmain(int argc, LPTSTR argv[]) {

 SERVICE_TABLE_ENTRY DispatchTable[] = {

  { ServiceName, ServiceMain }, { NULL, NULL }

 };

 StartServiceCtrlDispatcher(DispatchTable);

 return 0;

}

/* Точка входа ServiceMain, вызываемая при создании службы. */

void WINAPI ServiceMain(DWORD argc, LPTSTR argv[]) {

 DWORD i, Context = 1;

 /* Установить текущий каталог и открыть файл журнала, присоединяемый к существующему файлу. */

 /* Определить все элементы структуры состояния сервера. */

 hServStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;

 hServStatus.dwCurrentState = SERVICE_START_PENDING;

 hServStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE;

 hServStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIF0C_ERROR;

 hServStatus.dwServiceSpecificExitCode = 0;

 hServStatus.dwCheckPoint = 0;

 hServStatus.dwWaitHint = 2 * CS_TIMEOUT;

 hSStat = RegisterServiceCtrlHandlerEx(ServiceName, ServerCtrlHandler, &Context); 

 SetServiceStatus(hSStat, &hServStatus);

 /* Запустить специфическую для службы обработку; выполнение типового участка кода завершено. */

 if (ServiceSpecific(argc, argv) != 0) {

  hServStatus.dwCurrentState = SERVICE_STOPPED;

  hServStatus.dwServiceSpecificExitCode = 1;

  /* Ошибка при инициализации сервера. */

  SetServiceStatus(hSStat, &hServStatus);

  return;

 }

 /* Возврат сюда будет осуществлен лишь после завершения функции ServiceSpecific, указывающего на прекращение работы системы. */

 UpdateStatus(SERVICE_STOPPED, 0);

 return;

}

void UpdateStatus(int NewStatus, int Check)

/* Определить новое состояние и контрольную точку — задается либо истинное значение, либо приращение. */

{

 if (Check < 0) hServStatus.dwCheckPoint++;

 else hServStatus.dwCheckPoint = Check;

 if (NewStatus >= 0) hServStatus.dwCurrentState = NewStatus;

 SetServiceStatus(hSStat, &hServStatus);

 return;

}

/* Функция обработчика, активизируемая SCM для выполнения в том же */

/* потоке, что и основная программа. */

/* Последние три параметра не используются, так что обработчики, написанные*/

/* для версий Windows младше NT5, в этом примере также будут работать. */

VOID WINAPI ServerCtrlHandlerEx(DWORD Control, DWORD EventType, LPVOID lpEventData, LPVOID lpContext) {

 switch (Control) {

 case SERVICE_CONTROL_SHUTDOWN:

 case SERVICE_CONTROL_STOP:

  ShutDown = TRUE; /* Установить глобальный флаг завершения. */

  UpdateStatus(SERVICE_STOP_PENDING, –1);

  break;

 case SERVICE_CONTROL_PAUSE:

  PauseFlag = TRUE; /* Периодический опрос. */

  break;

 case SERVICE_CONTROL_CONTINUE:

  PauseFlag = FALSE;

  break;

 case SERVICE_CONTROL_INTERROGATE:

  break;

 default:

  if (Control > 127 && Control < 256) /*Пользовательские сигналы.*/ 

   break;

 }

 UpdateStatus(-1, –1); /* Инкрементировать контрольную точку. */

 return;

}

/* Эта специфическая для службы функция играет роль функции "main" и вызывается из более общей функции ServiceMain. Вообще говоря, вы можете взять любой сервер, например ServerNP.c, и поместить его код прямо сюда, переименовав функцию "main" в "ServiceSpecific". Однако для кода обновления состояния потребуются некоторые изменения. */

int ServiceSpecific(int argc, LPTSTR argv[]) {

 UpdateStatus(-1, –1); /* Инкрементировать контрольную точку. */

 /* … Инициализация системы … */

 /* Обеспечьте периодическое обновление контрольной точки. */

 return 0;

} 

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Глава 5. Оболочка bash

Из книги Linux для пользователя автора Костромин Виктор Алексеевич

Глава 5. Оболочка bash В этой главе мы рассмотрим работу с системой Linux в текстовом режиме, другими словами, с консоли или терминала. Начинающему пользователю может казаться, что он никогда не будет работать в этом режиме, поскольку существует графический режим. Однако это


5.1. Что такое оболочка?

Из книги Реестр Windows автора Климов Александр

5.1. Что такое оболочка? Как уже упоминалось выше, хотя мы часто говорим, что "пользователь работает с операционной системой", фактически это не верно, поскольку на деле взаимодействие с пользователем организует специальная программа. Существует два вида таких программ -


Оболочка Windows

Из книги Тонкости реестра Windows Vista. Трюки и эффекты автора Клименко Роман Александрович

Оболочка Windows Надоел Проводник в качестве оболочки Windows? Можно поставить любую программу, которая будет служить в качестве такой оболочки, например, progman.exe, входящий в стандартную поставку Windows. Для этого поменяйте значение параметра °Shell° на progman.exe в разделе


2.3. Оболочка Windows Vista

Из книги AutoCAD 2009 для студента. Самоучитель автора Соколова Татьяна Юрьевна

2.3. Оболочка Windows Vista Немаловажной частью операционной системы является оболочка, которая по странному стечению обстоятельств также представляет собой Проводник операционной системы, описанный выше. Сейчас мы рассмотрим некоторые возможности настройки элементов этой


Оболочка

Из книги Применение Windows API автора Легалов А И

Оболочка При создании оболочки (рис. 18.12) команду редактирования SOLIDEDIT следует вызывать из падающего меню Modify ? Solid Editing ? Shell либо щелчком на пиктограмме Shell на плавающей панели инструментов Solid Editing. В команде используются ключи Body, Shell и выдаются следующие запросы: Solids editing


Оболочка из классов для COM

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл


Оболочка из классов для OLE

Из книги В начале была командная строка автора Стивенсон Нил

Оболочка из классов для OLE Рационализация OLEПеревод А. И. ЛегаловаАнглоязычный оригинал находится на сервере компании Reliable


21.3. Оболочка irb

Из книги Linux: Полное руководство автора Колисниченко Денис Николаевич


Интерфейсная культура

Из книги AutoCAD 2009. Учебный курс автора Соколова Татьяна Юрьевна

Интерфейсная культура Несколько лет назад я зашел в продовольственный магазин, где и стал свидетелем следующей живописной живой картины около входа молодая пара стояла перед большим стендом косметики. Мужчина без энтузиазма держал торговую корзину, пока его дама


3.4. Командная оболочка. Bash

Из книги AutoCAD 2008 для студента: популярный самоучитель автора Соколова Татьяна Юрьевна

3.4. Командная оболочка. Bash Важнейшим из пользовательских процессов является командная оболочка (она же командный интерпретатор, или просто shell). Именно она обеспечивает взаимодействие пользователя с системой в текстовом режиме, позволяя вводить команды. Именно она


Оболочка

Из книги Недокументированные и малоизвестные возможности Windows XP автора Клименко Роман Александрович

Оболочка При создании оболочки (рис. 20.12) команду редактирования SOLIDEDIT следует вызывать из падающего меню Modify ? Solid Editing ? Shell либо щелчком на пиктограмме Shell на плавающей панели инструментов Solid Editing. В команде используются ключи Body, Shell и выдаются следующие


Оболочка

Из книги Установка, настройка и восстановление Windows 7 на 100% автора Ватаманюк Александр Иванович

Оболочка При создании оболочки команду редактирования SOLIDEDIT следует вызывать из падающего меню Modify ? Solid Editing ? Shell либо щелчком на пиктограмме Shell на плавающей панели инструментов Solid Editing. В команде используются ключи Body, Shell и выдаются следующие запросы:Solids editing automatic


Оболочка

Из книги автора

Оболочка Теперь рассмотрим команды rundll32.exe, предназначенные для взаимодействия с пользователем. Раньше при описании файла inetcpl.cpl уже упоминались такие команды, но, кроме них, существует также некоторое количество команд, предоставляемых стандартными библиотеками


Оболочка

Из книги автора

Оболочка На самом деле настроек браузера, доступ к которым нельзя получить с помощью диалоговых окон, не очень много, поэтому глава будет небольшой. Но она будет, и начнется, как и все другие главы книги, c рассмотрения настроек оболочки.В рассказе о настройках оболочки


Оболочка

Из книги автора

Оболочка Как обычно, все параметры реестра будут разделены на два типа — те, что изменяют оболочку программы Outlook Express, и те, что определяют конфигурацию Outlook Express. И, конечно же, сначала рассмотрим некоторые параметры, относящиеся к настройке оболочки почтового клиента.


Оболочка

Из книги автора

Оболочка Данный раздел содержит параметры, изменение которых влияет на скорость работы интерфейса, внешнее оформление основных элементов интерфейса, таких как меню Пуск, Панель задач и т. д. (рис. 24.17). Рис. 24.17. Содержимое подраздела Проводник Windows раздела ОболочкаВсе