Я пытаюсь создать сервис по примеру, приведенному в ссылке ниже:
http://msdn.microsoft.com/en-us/library/bb540475(v=VS.85).aspx
Что меня интересует, так это возможность улавливать пользовательские события «блокировка» и «разблокировка» рабочей станции.
Используя код из предоставленного примера, я изменил следующее:
Строка 15:
Оригинал:
VOID WINAPI SvcCtrlHandler( DWORD );
Изменен:
DWORD WINAPI SvcCtrlHandler( DWORD, DWORD, LPVOID, LPVOID );
Строка 141:
Оригинал:
gSvcStatusHandle = RegisterServiceCtrlHandler( SVCNAME, SvcCtrlHandler);
Изменено:
gSvcStatusHandle = RegisterServiceCtrlHandlerEx( SVCNAME, SvcCtrlHandler, NULL);
Строка 244:
Оригинал:
gSvcStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
Изменено:
gSvcStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SESSIONCHANGE;
Строка 266:
Оригинал:
VOID WINAPI SvcCtrlHandler( DWORD dwCtrl )
{
// Handle the requested control code.
switch(dwCtrl)
{
case SERVICE_CONTROL_STOP:
ReportSvcStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);
// Signal the service to stop.
SetEvent(ghSvcStopEvent);
ReportSvcStatus(gSvcStatus.dwCurrentState, NO_ERROR, 0);
return;
case SERVICE_CONTROL_INTERROGATE:
break;
default:
break;
}
}
Изменен:
DWORD WINAPI SvcCtrlHandler( DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext )
{
DWORD dwErrorCode = NO_ERROR;
switch(dwControl)
{
case SERVICE_CONTROL_STOP:
ReportSvcStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);
// Signal the service to stop.
SetEvent(ghSvcStopEvent);
ReportSvcStatus(gSvcStatus.dwCurrentState, NO_ERROR, 0);
break;
case SERVICE_CONTROL_INTERROGATE:
break;
case SERVICE_CONTROL_SESSIONCHANGE:
ReportSvcStatus(gSvcStatus.dwCurrentState, NO_ERROR, 0);
break;
default:
break;
}
return dwErrorCode;
}
С изменениями, указанными выше, моя служба скомпилирована и установлена нормально.
Я пытаюсь запустить свой сервис на компьютере с Windows 7, он запустится нормально (но я не смогу остановить, приостановить или сделать что-нибудь для сервиса, так как все опции будут отключены).
Я также попробовал свой сервис на моем компьютере с Windows 2000, он даже не запускается (он будет зависать в состоянии «запуска»)
Моя главная задача - заставить сервис работать должным образом в среде Windows 7, а обратная совместимость в Windows 2000 будет бонусом.
Может кто-нибудь пожалуйста посоветовать?
Заранее спасибо,
Рон