На главную

On-line справка по Win32 API

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z | Скачать Вниз

Writing a Control Handler Function



The MyServiceCtrlHandler function in the following example is the Handler function. When this function is called by the dispatcher thread, it handles the control code passed in the Opcode parameter and then calls the SetServiceStatus function to update the service's status. Every time a Handler function receives a control code, it is appropriate to return status with a call to SetServiceStatus regardless of whether the service acts on the control.

When the pause control is received, MyServiceCtrlHandler simply sets the dwCurrentState field in the SERVICE_STATUS structure to SERVICE_PAUSED. Likewise, when the continue control is received, the state is set to SERVICE_RUNNING. Therefore, MyServiceCtrlHandler is not a good example of how to handle the pause and continue controls. Because MyServiceCtrlHandler is a template for a Handler function, code for the pause and continue controls is included for completeness. A service that supports either the pause or continue control should handle these controls in a way that makes sense. Many services support neither the pause or continue control. If the service indicates that it does not support pause or continue with the dwControlsAccepted parameter, then the SCM will not send pause or continue controls to the service's Handler function.

To output debugging information, MyServiceCtrlHandler calls SvcDebugOut. The source code SvcDebugOut is listed in Writing a Service Program's main Function
.

VOID MyServiceCtrlHandler (DWORD Opcode)
{
DWORD status;

switch(Opcode)
{
case SERVICE_CONTROL_PAUSE:
// Do whatever it takes to pause here.
MyServiceStatus.dwCurrentState = SERVICE_PAUSED;
break;

case SERVICE_CONTROL_CONTINUE:
// Do whatever it takes to continue here.
MyServiceStatus.dwCurrentState = SERVICE_RUNNING;
break;

case SERVICE_CONTROL_STOP:

// Do whatever it takes to stop here.
MyServiceStatus.dwWin32ExitCode = 0;
MyServiceStatus.dwCurrentState = SERVICE_STOPPED_PENDING;
MyServiceStatus.dwCheckPoint = 0;
MyServiceStatus.dwWaitHint = 0;

if (!SetServiceStatus (MyServiceStatusHandle,
&MyServiceStatus))
{
status = GetLastError();
SvcDebugOut(" [MY_SERVICE] SetServiceStatus error

%ld\n",status);
}

SvcDebugOut(" [MY_SERVICE] Leaving MyService \n",0);
return;

case SERVICE_CONTROL_INTERROGATE:
// Fall through to send current status.
break;

default:
SvcDebugOut(" [MY_SERVICE] Unrecognized opcode %ld\n",
Opcode);
}

// Send current status.
if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus))

{
status = GetLastError();
SvcDebugOut(" [MY_SERVICE] SetServiceStatus error
%ld\n",status);
}
return;
}



Пригласи друзей и счет твоего мобильника всегда будет положительным!
Предыдущая статья
 
Сайт Народ.Ру Интернет
Следующая статья
Пригласи друзей и счет твоего мобильника всегда будет положительным!

Сочинение Управляющей Функции Вручителя



Функция MyServiceCtrlHandler в следующем примере - функция Вручителя. Когда эта функция названа резьбой диспетчера, она оперирует управляющий код пройденный в параметр Opcode затем называет функцию SetServiceStatus, чтобы корректировать статус услуги. Каждый раз функция Вручителя получает управляющий код, она подходящая, чтобы возвращать статус с вызовом на SetServiceStatus независимо от того, что услуга действует на управлении.

Когда управление паузы получено, MyServiceCtrlHandler просто устанавливает область dwCurrentState в структуре SERVICE_STATUS на SERVICE_PAUSED. Подобно, когда продолжать управление быть получен, состояние установлено на SERVICE_RUNNING. Следовательно, MyServiceCtrlHandler - не хороший пример того как, чтобы оперировать паузу и продолжать элементы управления. Поскольку MyServiceCtrlHandler - шаблон для функции Вручителя, закодируйтесь для паузы и продолжайте элементы управления быть включен для полноты. Услуга, которая поддерживает или пауза или продолжает управление должно оперировать эти элементы управления в некотором отношении, что имеет смысл. Много услуг не поддерживают никакую паузу или продолжают управление. Если услуга указывает, что она не поддерживает паузу или продолжает dwControlsAccepted параметр, тогда SCM не пошлет паузу или продолжает элементы управления в функцию Вручителя услуги.

В выход отладочную информацию, вызовы MyServiceCtrlHandler SvcDebugOut. Исходный код SvcDebugOut указывается в письменной форме Программная основная Функция Услуги
.

ПУСТОТА MyServiceCtrlHandler (DWORD Opcode)
{
СТАТУС DWORD;

ключ(Opcode)
{
случай SERVICE_CONTROL_PAUSE: // Делать все, что требуется, чтобы останавливаться здесь.
MyServiceStatus.dwCurrentState = SERVICE_PAUSED;
прерывание;

случай SERVICE_CONTROL_CONTINUE: // Делать все, что требуется, чтобы оставаться здесь.
MyServiceStatus.dwCurrentState = SERVICE_RUNNING;
прерывание;

случай SERVICE_CONTROL_STOP:

// Сделайте все, что требуется, чтобы прекращаться здесь.
MyServiceStatus.dwWin32ExitCode = 0;
MyServiceStatus.dwCurrentState = SERVICE_STOPPED_PENDING;
MyServiceStatus.dwCheckPoint = 0;
MyServiceStatus.dwWaitHint = 0;

если (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus))
{
статус = GetLastError();
SvcDebugOut(" [MY_SERVICE] ОШИБКА SetServiceStatus

%ld\n",статус);
}

SvcDebugOut(" [MY_SERVICE] ОСТАВЛЯЯ MyService \n",0);
возврат;

случай SERVICE_CONTROL_INTERROGATE: // Проваливать, чтобы посылать текущий статус.
прерывание;

умолчание:
SvcDebugOut(" [MY_SERVICE] НЕУЗНАННЫЙ opcode %ld\n", Opcode);
}

// Пошлите текущий статус.
если (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus))

{
статус = GetLastError();
SvcDebugOut(" [MY_SERVICE] ОШИБКА SetServiceStatus %ld\n",статус);
}
возврат;
}



Вверх Version 1.3, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод OpenGL  Русский перевод Win32 API
 
Используются технологии uCoz