Почему служба останавливается с ошибкой 1053(служба вовремя не ответила на запрос)?
static SERVICE_STATUS MyServiceStatus;
static SERVICE_STATUS_HANDLE MyServiceStatusHandle;
BOOL ReportStatusToSCMgr(DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwWaitHint)
{
static DWORD dwCheckPoint = 1;
if (dwCurrentState == SERVICE_START_PENDING)
MyServiceStatus.dwControlsAccepted = 0;
else
MyServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
MyServiceStatus.dwCurrentState = dwCurrentState;
MyServiceStatus.dwWin32ExitCode = dwWin32ExitCode;
MyServiceStatus.dwWaitHint = dwWaitHint;
if (dwCurrentState == SERVICE_RUNNING || dwCurrentState == SERVICE_STOPPED)
MyServiceStatus.dwCheckPoint = 0;
else
MyServiceStatus.dwCheckPoint = dwCheckPoint++;
if (!SetServiceStatus(MyServiceStatusHandle, &MyServiceStatus))
{
return FALSE;
}
return TRUE;
}
DWORD MyServiceInitialization(DWORD argc, LPTSTR *argv,DWORD *specificError)
{
argv;
argc;
specificError;
return(0);
}
VOID SvcDebugOut(LPSTR String, DWORD Status)
{
CHAR Buffer[1024];
if (strlen(String) < 1000)
{
sprintf(Buffer, String, Status);
OutputDebugStringA(Buffer);
}
}
VOID WINAPI MyServiceCtrlHandler (DWORD Opcode)
{ DWORD status;
BOOL fStopDependencies;
DWORD dwTimeout;
switch(Opcode)
{
case SERVICE_CONTROL_PAUSE:
MyServiceStatus.dwCurrentState = SERVICE_PAUSED;
break;
case SERVICE_CONTROL_CONTINUE:
MyServiceStatus.dwCurrentState = SERVICE_RUNNING;
break;
case SERVICE_CONTROL_STOP:
ReportStatusToSCMgr(SERVICE_STOP_PENDING, NO_ERROR, 0);
SvcDebugOut(" [MY_SERVICE] Leaving MyService \n",0);
return;
case SERVICE_CONTROL_INTERROGATE:
break;
default:
break;
SvcDebugOut(" [MY_SERVICE] Unrecognized opcode %ld\n",Opcode);
}
ReportStatusToSCMgr(MyServiceStatus.dwCurrentState, NO_ERROR, 0);
return;
}
void WINAPI MyService_main (DWORD argc, LPTSTR *argv)
{
DWORD status;
DWORD specificError;
MyServiceStatusHandle = RegisterServiceCtrlHandler("MyService",MyServiceCtrlHandler);
if (MyServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
{
SvcDebugOut(" [MY_SERVICE] RegisterServiceCtrlHandler failed %d\n", GetLastError());
return;
}
MyServiceStatus.dwServiceType = SERVICE_WIN32;
MyServiceStatus.dwCurrentState = SERVICE_START_PENDING;
MyServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;
MyServiceStatus.dwWin32ExitCode = 0;
MyServiceStatus.dwServiceSpecificExitCode = 0;
MyServiceStatus.dwCheckPoint = 0;
MyServiceStatus.dwWaitHint = 0;
status = MyServiceInitialization(argc,argv, &specificError);
if (status != NO_ERROR)
{
MyServiceStatus.dwCurrentState = SERVICE_STOPPED;
MyServiceStatus.dwCheckPoint = 0;
MyServiceStatus.dwWaitHint = 0;
MyServiceStatus.dwWin32ExitCode = status;
MyServiceStatus.dwServiceSpecificExitCode = specificError;
SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus);
return;
}
MyServiceStatus.dwCurrentState = SERVICE_RUNNING;
MyServiceStatus.dwCheckPoint = 0;
MyServiceStatus.dwWaitHint = 0;
if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus))
{
status = GetLastError();
SvcDebugOut(" [MY_SERVICE] SetServiceStatus error%ld\n",status);
}
}
int _tmain()
{
SERVICE_TABLE_ENTRY DispatchTable[] =
{
{"MyService",MyService_main},
{NULL,NULL}
};
if (StartServiceCtrlDispatcher( DispatchTable))
{
SvcDebugOut(" [MY_SERVICE] StartServiceCtrlDispatcher (%d)\n",GetLastError());
}
return 0;
}
25.11.05 06:29: Перенесено модератором из 'C/C++' — Odi$$ey