hur.cn - 华软网

 热门搜索

用c++写了个系统服务,如何让服务进程接受以后自动重启?

  作者:未知    来源:网络    更新时间:2011/8/19
用c++写了一个服务,根据windows的服务规范写的,但是现在有个问题,我记得原来有人写过服务,如果手动结束了服务的进程,windows会自动重启该服务,不知道该如何实现。我记得听人说过,好像就是一个什么参数的问题,也不知道是在程序里面哪儿修改,还是说要修改这个服务的注册表,知道的请告知一下,非常感谢。
ps:什么守护进程、三线程、注入什么的,就不要说了,我现在就是想依赖windows自身把服务重启。
---华软 网友回答---
jf.......
---华软网友回复---
继续顶~答案正确,马上结贴给分,纯接分的直接无视~
---华软网友回复---
需要一个程序创建服务后设置,调用ChangeServiceConfig2设置SC_ACTION_RESTART

http://www.cnblogs.com/ahuo/archive/2009/04/24/1442941.html
---华软网友回复---
你做的服务检测进程的退出吗,在异常和正常情况下,做相应的处理
---华软网友回复---
依赖自身自动启动,那是服务的类型为 自动启动(服务类型有手动、自动、禁用)

这个是在创建服务的时候设定的,如下:
C++">
        schService = CreateService(
            schSCManager,               // SCManager database
            TEXT(theApp.SZSERVICENAME),        // name of service
            TEXT(theApp.SZSERVICEDISPLAYNAME), // name to display
            SERVICE_ALL_ACCESS,         // desired access
            SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,  // service type
            SERVICE_AUTO_START,         // 这里指定服务类型            SERVICE_ERROR_NORMAL,       // error control type
            szPath,                     // service's binary
            NULL,                       // no load ordering group
            NULL,                       // no tag identifier
            TEXT(theApp.SZDEPENDENCIES),// dependencies
            NULL,                       // LocalSystem account
            NULL);                      // no password


如果要在系统运行中,服务停止了让又自动启动,WINDOWS是没有这个功能的,你得自己编写代码
可以开双进程保护,也就是2个服务进程,一个是保护用的,一个是真正的服务进程,服务进程挂掉后,保护进程把它拉起来。保护进程挂掉后,服务进程把它拉起来,这样就OK了。
---华软网友回复---
SC_ACTION_RESTART
ChangeServiceConfig2(..., SERVICE_CONFIG_FAILURE_ACTIONS, ...);

---华软网友回复---
自动重启服务好像是加载服务时用某函数的一个参数实现,只记得这个参数是一串大写字母,中间有下划线,并且有“AUTO"的字样。
---华软网友回复---
3楼6楼说的都是正确的,也成功实现了,非常感谢,马上结贴去。
---华软网友回复---
C++">
SERVICE_FAILURE_ACTIONS ServiceFailAction;
SC_ACTION SC_Action[3];

for(UINT i=0; i<sizeof(SC_Action)/sizeof(SC_ACTION); i++)
{
SC_Action[i].Delay = 60*1000; //1分钟后重新启动服务
SC_Action[i].Type = SC_ACTION_RESTART; //失败后重启服务
}

ServiceFailAction.dwResetPeriod = 60*60*24; //1天后,重置失败计数
ServiceFailAction.lpRebootMsg = NULL;
ServiceFailAction.lpCommand = NULL;
ServiceFailAction.cActions = 3;
ServiceFailAction.lpsaActions = SC_Action;

SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, GENERIC_ALL);
SC_HANDLE hService = ::OpenService(hSCM, TEXT("Themes"), GENERIC_ALL);
ChangeServiceConfig2(hService, SERVICE_CONFIG_FAILURE_ACTIONS, &ServiceFailAction);

---华软网友回复---
楼上的,我都结贴了,你怎么才来
---华软网友回复---
继续顶~答案正确,马上结贴给分,纯接分的直接无视~      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。