写了一个系统服务程序,最近要添加新的功能,就是在服务运行过程中定时检测某个状态,如果状态异常,则服务退出。
这段进行判断的代码应该加在系统服务的那个位置?ServiceMain还是其他的什么地方?
另外如果加在ServiceMain中,要退出服务如何实现?
这段进行判断的代码应该加在系统服务的那个位置?ServiceMain还是其他的什么地方?
另外如果加在ServiceMain中,要退出服务如何实现?
调试欢乐多
void ServiceMain(int argc, char** argv)
{
int error; ServiceStatus.dwServiceType = SERVICE_WIN32;
ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwServiceSpecificExitCode = 0;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0; hStatus = RegisterServiceCtrlHandler("DMSServer2", (LPHANDLER_FUNCTION)ControlHandler);
if (hStatus == (SERVICE_STATUS_HANDLE)0)
{
// Registering Control Handler failed
logger.error("Registering Control Handler failed.\r\n");
return;
} // Initialize Service
error = InitService();
if (error != 0)
{
// Initialization failed
logger.error("Initialize windows serivce(DMSServer) failed.\r\n");
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
ServiceStatus.dwWin32ExitCode = -1;
SetServiceStatus(hStatus, &ServiceStatus);
return;
} // We report the running status to SCM.
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(hStatus, &ServiceStatus); // The worker loop of a service
if (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
{
YourServer(); }
return;
}
另一个函数里:
case SERVICE_CONTROL_SHUTDOWN:
logger.info("The windows serivce(DMSServer) shut down.\r\n");
// shut down DMS server thread
Shutdown(); //自已写的一个 ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(hStatus, &ServiceStatus);
线程ID可以在实现服务的方法PreMessageLoop中用GetCurrentThreadID取得,或其它实现服务的方法都可以
SetServiceStatus( SERVICE_STOP_PENDING );
::PostThreadMessage( m_dwThreadID, WM_VCFW_DEVICEEVENTRECEIVER_DESTROY, 0, 0 );
::PostThreadMessage( m_dwThreadID, WM_QUIT, 0, 0 );
if (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
{
[color=#FF0000]YourServer();[/color] }
return;YourServer()里直接退出不就可以了吗?
你要看看YourServer()里怎么写的,有的是一个消息循环,有的是一个其它循环,或者启动其它线程。
消息循环就发quit消息,循环或者线程就退出就可以了吧?
做成服务的目地就是产生一个“死循环”不停的干活,如果有可能将会永不休息(那怕内部只是在sleep(1万年)它也是在干活)地干活,直到累死或崩溃。如果在服务中要实现你说的功能和处理结果,那么你的设计就有问题。因此,你这个检测状态只能是服务当中的一个“任务”而已,不存在退不退出服务的问题。