, , RegisterServiceCtrlHandlerEx, :
DWORD WINAPI HandlerEx(DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext)
dwControl , SCM. NT5 RegisterServiceCtrlHandlerEx .
14 dwControl, , . 13.3, NT5 XP. , :
SERVICE_CONTROL_STOP
SERVICE_CONTROL_PAUSE
SERVICE_CONTROL_CONTINUE
SERVICE_CONTROL_INTERROGATE
SERVICE_CONTROL_SHUTDOWN
, 128-255, .
dwEventType 0, , . dwEventType , .
, lpContext , RegisterServiceCtrlHandlerEx .
SCM , , switch, .
: " "
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;
}