Установка службы Windows возвращает ошибку 1053

Я создал Http-сервер (консольное приложение C ++ Win 32) и хотел запустить его как сервис.
Этот сервер имеет основной поток и поток прослушивателя, который будет прослушивать входящий трафик. Основной поток будет блокироваться навсегда.

Я создал установщик NSIS, который использует SimpleSC Плагин для установки и запуска сервера

SimpleSC::InstallService "HttpServer" "HttpServer" "16" "2" "$INSTDIR\Server.exe" "" "" ""
SimpleSC::StartService "HttpServer" "" 30

Я могу установить службу, но она не запускается и возвращает ошибку 1053. Это из-за блока основного потока? Пожалуйста помоги мне с этим.

0

Решение

Проблема должна быть в вашем сервисном коде. В обработчике управления службами, который вы объявили в вызове RegisterServiceCtrlHandler() вам нужно обработать несколько типов запросов и вернуть их в соответствии с отзывами менеджера системного сервиса. Это позволило системе понять, что ваш сервис работает правильно и каково его текущее состояние.

Если вы не отвечаете на все типы запросов (особенно SERVICE_CONTROL_INTERROGATE), или если вы не ответите в течение ограниченного времени, система определит, что ваша служба не работает / остановлена.

Это пример обработчика управления, который я использую в моем коде:

//Feedback() is a custom function to put log into the system events and / or OutputDebugString()
//mSrvStatus is a global SERVICE_STATUS

void WINAPI SrvControlHandler(DWORD Opcode) {
DWORD state;

switch (Opcode) {
case SERVICE_CONTROL_PAUSE:
Feedback(FEED_EVENTS|FEED_ODS, "Pausing %s", SRVNAME);
bActive = false;
state = SERVICE_PAUSED;
break;
case SERVICE_CONTROL_CONTINUE:
//refresh our settings from registry before continuing
GetRegistrySettings();
Feedback(FEED_EVENTS|FEED_ODS, "Continuing %s with refresh=%d", SRVNAME, dwRefresh);
bActive = true;
state = SERVICE_RUNNING;
break;
case SERVICE_CONTROL_STOP:
case SERVICE_CONTROL_SHUTDOWN:
Feedback(FEED_EVENTS|FEED_ODS, "Stopping %s", SRVNAME);
ReportSrvStatus(SERVICE_STOP_PENDING, NO_ERROR, 0); //ok, we begin to stop
//The final ReportSrvStatus(SERVICE_STOPPED, NO_ERROR, 0);
//is sent from the function that started the service
//that is waiting forever on the hSrvStopEvt event
bActive = false;                                    //we tell the thread to stop fetching
SetEvent(hSrvStopEvt);                              //and we signal the final event
return;
break;
case SERVICE_CONTROL_INTERROGATE:
state = mSrvStatus.dwCurrentState;
Feedback(FEED_ODS, "%s interrogated by SCM, returned %d", SRVNAME, state);
break;
default:
Feedback(FEED_ODS, "other control resquest ?? - %d", Opcode);
state = mSrvStatus.dwCurrentState;
}
ReportSrvStatus(state, NO_ERROR, 0);
}

/* Sets the current service status and reports it to the SCM.

Parameters:
dwCurrentState - The current state (see SERVICE_STATUS)
dwWin32ExitCode - The system error code
dwWaitHint - Estimated time for pending operation, in milliseconds
*/
void ReportSrvStatus( DWORD dwCurrentState,
DWORD dwWin32ExitCode,
DWORD dwWaitHint) {
static DWORD dwCheckPoint = 1;

mSrvStatus.dwCurrentState = dwCurrentState;
mSrvStatus.dwWin32ExitCode = dwWin32ExitCode;
mSrvStatus.dwWaitHint = dwWaitHint;

if (dwCurrentState == SERVICE_START_PENDING)
mSrvStatus.dwControlsAccepted = 0;
else mSrvStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_PAUSE_CONTINUE|SERVICE_ACCEPT_SHUTDOWN;

if ( (dwCurrentState == SERVICE_RUNNING) ||
(dwCurrentState == SERVICE_STOPPED) )
mSrvStatus.dwCheckPoint = 0;
else mSrvStatus.dwCheckPoint = dwCheckPoint++;

SetServiceStatus( hSrvStatus, &mSrvStatus );
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]