2010-07-14 4 views
9

Я создаю службу, используя CreateService. Служба будет работать снова нормально, если произойдет сбой, и я хотел бы, чтобы Windows перезапустила службу, если она сработает. Я знаю, что это можно установить из сервисов msc, как показано ниже.Как создать сервис, который перезапускается при сбое

Windows Service Recovery Dialog

Как можно программно настроить службу всегда перезагружать, если это произойдет сбой.

ответ

6

Вы хотите позвонить ChangeServiceConfig2 после того, как вы установили службу. Установите второй параметр в SERVICE_CONFIG_FAILURE_ACTIONS и передать экземпляр SERVICE_FAILURE_ACTIONS в качестве третьего параметра, что-то вроде этого:

int numBytes = sizeof(SERVICE_FAILURE_ACTIONS) + sizeof(SC_ACTION); 
std::vector<char> buffer(numBytes); 

SERVICE_FAILURE_ACTIONS *sfa = reinterpret_cast<SERVICE_FAILURE_ACTIONS *>(&buffer[0]); 
sfa.dwResetPeriod = INFINITE; 
sfa.cActions = 1; 
sfa.lpsaActions[0].Type = SC_ACTION_RESTART; 
sfa.lpsaActions[0].Delay = 5000; // wait 5 seconds before restarting 

ChangeServiceConfig2(hService, SERVICE_CONFIG_FAILURE_ACTIONS, sfa); 
3

Ответ выше даст вам суть ... но она не будет компилировать.

попробовать:

SERVICE_FAILURE_ACTIONS sfa; 
SC_ACTION actions; 

sfa.dwResetPeriod = INFINITE; 
sfa.lpCommand = NULL; 
sfa.lpRebootMsg = NULL; 
sfa.cActions = 1; 
sfa.lpsaActions = &actions; 

sfa.lpsaActions[0].Type = SC_ACTION_RESTART; 
sfa.lpsaActions[0].Delay = 5000; 

ChangeServiceConfig2(hService, SERVICE_CONFIG_FAILURE_ACTIONS, &sfa) 
8

Б подход Deltanine, но модифицировал его немного, чтобы быть в состоянии контролировать каждое действие отказа:

SERVICE_FAILURE_ACTIONS servFailActions; 
SC_ACTION failActions[3]; 

failActions[0].Type = SC_ACTION_RESTART; //Failure action: Restart Service 
failActions[0].Delay = 120000; //number of seconds to wait before performing failure action, in milliseconds = 2minutes 
failActions[1].Type = SC_ACTION_RESTART; 
failActions[1].Delay = 120000; 
failActions[2].Type = SC_ACTION_NONE; 
failActions[2].Delay = 120000; 

servFailActions.dwResetPeriod = 86400; // Reset Failures Counter, in Seconds = 1day 
servFailActions.lpCommand = NULL; //Command to perform due to service failure, not used 
servFailActions.lpRebootMsg = NULL; //Message during rebooting computer due to service failure, not used 
servFailActions.cActions = 3; // Number of failure action to manage 
servFailActions.lpsaActions = failActions; 

ChangeServiceConfig2(sc_service, SERVICE_CONFIG_FAILURE_ACTIONS, &servFailActions); //Apply above settings 
Смежные вопросы