写了一个系统服务程序,最近要添加新的功能,就是在服务运行过程中定时检测某个状态,如果状态异常,则服务退出。
这段进行判断的代码应该加在系统服务的那个位置?ServiceMain还是其他的什么地方?
另外如果加在ServiceMain中,要退出服务如何实现?

解决方案 »

  1.   

    这段进行判断的代码可以加在ServiceMain里,调用一个自己的函数,启用多线程监测。参考一下:http://zh-cn.w3support.net/index.php?db=so&id=704991以前的代码,不知道有没有参考性:
    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);
      

  2.   

    既然是服务,没事做的时候sleep就可以了,没必要退出吧。如果一定要退出,可以OpenService然后ControlService,向服务发送停止命令试试。再不行,如果是单进程的服务,直接ExitProcess
      

  3.   

    要想停止服务可以用如下代码
    线程ID可以在实现服务的方法PreMessageLoop中用GetCurrentThreadID取得,或其它实现服务的方法都可以
    SetServiceStatus( SERVICE_STOP_PENDING );
    ::PostThreadMessage( m_dwThreadID, WM_VCFW_DEVICEEVENTRECEIVER_DESTROY, 0, 0 );
    ::PostThreadMessage( m_dwThreadID, WM_QUIT, 0, 0 );
      

  4.   

     // The worker loop of a service
       if (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
       {
          [color=#FF0000]YourServer();[/color]   }
       return;YourServer()里直接退出不就可以了吗?
    你要看看YourServer()里怎么写的,有的是一个消息循环,有的是一个其它循环,或者启动其它线程。
    消息循环就发quit消息,循环或者线程就退出就可以了吧?
      

  5.   


    做成服务的目地就是产生一个“死循环”不停的干活,如果有可能将会永不休息(那怕内部只是在sleep(1万年)它也是在干活)地干活,直到累死或崩溃。如果在服务中要实现你说的功能和处理结果,那么你的设计就有问题。因此,你这个检测状态只能是服务当中的一个“任务”而已,不存在退不退出服务的问题。