Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Пример функций сервиса.

Читайте также:
  1. A, Б - органические анионы (OA-, в качестве примера на рисунке продемонстрирована PAH-) и
  2. Example of Jumping / Пример сверхсветового прыжка
  3. Gt;Приведите примеры
  4. II Примерная тематика ознакомительной практики
  5. II. Описание трудовых функций, входящих в профессиональный стандарт
  6. II. ПРИМЕРНЫЙ ПЕРЕЧЕНЬ ДОЛЖНОСТНЫХ ЛИЦ ПУБЛИЧНЫХ МЕЖДУНАРОДНЫХ ОРГАНИЗАЦИЙ
  7. III. Примеры предпринимательской деятельности можно встретить даже в сказках.

Пример исходного кода сервиса Win32, выпоняемого как консольное приложение. Большая часть кода взята из примера в MSDN [1]. В MSDN программа называется Svc.cpp. Здесь программа называется mys.cpp.

Файл sample.h создается при построении DLL сообщений - Sample.dll. Для построения DLL сообщений выполняются следующие действия: 1. mc –U sample.mc; 2. rc –r sample.rc; 3. link –dll –noentry –out: saple.dll sample.res.

#include <windows.h>

#include <tchar.h>

#include <strsafe.h>

#include "sample.h"

using namespace std;

SERVICE_STATUS Status;

SERVICE_STATUS_HANDLE StatusHandle;

HANDLE ControlWorking = NULL;

VOID WINAPI MyServiceHandler(DWORD);

VOID WINAPI MyServiceMain(DWORD, LPTSTR *);

//главная точка входа процесса

void main(int argc, TCHAR *argv[])

{

if(lstrcmpi(argv[1], TEXT("install")) == 0)

{

printf("Cannot install service (%d)\n", GetLastError());

return;

}

SERVICE_TABLE_ENTRY DispatchTable[] =

{ { L”SeviceName”, (LPSERVICE_MAIN_FUNCTION) MyServiceMain },

{ NULL, NULL } }; //перечень всех сервисов процесса

//Возврат из вызова – при остановке работы сервиса.

// Процесс должен быть завершент при возврате из вызова.

if (!StartServiceCtrlDispatcher(DispatchTable))

{

printf(“Start ServiceCtrlDispatcher: Error %ld\n”, GetLastError());

return;

}

}

// Точка входа в сервис

VOID WINAPI SvcMain(DWORD dwArgc, LPTSTR *lpszArgv)

{

// Регистрация точки входа handler

StatusHandle = RegisterServiceCtrlHandler(

L”ServiceName”,

MyServiceHandler);

if(! StatusHandle)

{

printf("RegisterServiceCtrlHandler Error\n");

return;

}

// Определение полей структуры SERVICE_STATUS

Status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;

Status.dwCurrentState = SERVICE_START_PENDING;

Status.dwControlAccepted = SERVICE_ACCEPT_STOP;

Status.dwWin32ExitCode = 0;

Status.dwCheckPoint = 0;

Status.dwWaitHint = 0;

// Сообщение об инициализации для SCM

ReportSvcStatus(SERVICE_START_PENDING, NO_ERROR, 3000);

//Мьютекс для защиты рабочей секции потока сервиса

ControlWorking = CreateMutex(

NULL, // атрибуты защиты по умолчанию

FALSE, // нет владельца

NULL); // безимянный mutex

if (ControlWorking == NULL)

{

printf("CreateMutex error: %d\n", GetLastError());

return;

}

Status.dwCurrentState = SERVICE_RUNNING;

//Сообщение текущего статуса после завершения инициализации

SetServiceStatus(StatusHandle,&Status);

While(true)

{

// что-то делаем

WaitForSingleObject(ControlWorking,INFINITE);

//критические действия

ReleaseMutex(ControlWorking);

}

return;

}

//Точка входа Handler

VOID WINAPI MyServiceHandler(DWORD dwCtrl)

{

switch(dwCtrl)

{

case SERVICE_CONTROL_STOP:

//ждем выхода из критической секции

WaitForSingleObject(ControlWorking,INFINITE);

Status.dwCurrentState = SERVICE_STOP_PENDING;

CloseHandel(ControlWorking);

SetSeviceStatus(StatusHandel,&Status);

return;

case SERVICE_CONTROL_SHUTDOWN:

//ждем выхода из критической секции

WaitForSingleObject(ControlWorking,INFINITE);

Status.dwCurrentState = SERVICE_STOPPED;

CloseHandel(ControlWorking);

SetSeviceStatus(StatusHandel,&Status);

return;

case SERVICE_CONTROL_INTERROGATE:

// Fall through to send current status.

break;

 

default:

break;

}

return;

}


Дата добавления: 2015-08-13; просмотров: 68 | Нарушение авторских прав


Читайте в этой же книге: Службы Windows. | Диспетчер управления сервисами (SCM) | Программы управления сервисами | Учетные зависи сервиса | Начало работы сервиса | Выполнение сервиса | Структура программы сервиса | Точка входа main |
<== предыдущая страница | следующая страница ==>
Точка входа в сервис (ServiceMain)| Отладка сервиса.

mybiblioteka.su - 2015-2024 год. (0.006 сек.)