.


:




:

































 

 

 

 





, , 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;

}





:


: 2015-09-20; !; : 560 |


:

:

, .
==> ...

1696 - | 1470 -


© 2015-2024 lektsii.org - -

: 0.014 .