在编写Windows服务的时候,须要调用API函数::SetServiceStatus()向服务控制管理器(SCM)提交更新当前服务的状态信息, 其第2个参数为指向SERVICE_STATUS结构的指针,SERVICE_STATUS结构中包含了表示当前服务状态的信息,对其各成员一一分析:html
typedef struct _SERVICE_STATUS {
DWORD dwServiceType;
DWORD dwCurrentState;
DWORD dwControlsAccepted;
DWORD dwWin32ExitCode;
DWORD dwServiceSpecificExitCode;
DWORD dwCheckPoint;
DWORD dwWaitHint;
} SERVICE_STATUS, *LPSERVICE_STATUS;函数
dwServiceType:指明服务可执行文件的类型。若是可执行文件中只有一个单 独的服务,就把这个成员设置成SERVICE_WIN32_OWN_PROCESS;若是拥有多个服务的话,就设置成 SERVICE_WIN32_SHARE_PROCESS。除了这两个标志以外,若是你的服务须要和桌面发生交互(固然不推荐这样作),就要用“|”运算 符附加上SERVICE_INTERACTIVE_PROCESS。这个成员的值在服务的生存期内绝对不该该改变。ui
dwCurrentState:用于通知SCM此服务的现行状态。为了报告服务仍在初始化,应该把这个成员设置成SERVICE_START_PENDING。spa
dwControlsAccepted:指明服务接受什么样的控制通知。若是容许一个 服务控制程序(SCP)去暂停/继续服务,就把它设成SERVICE_ACCEPT_PAUSE_CONTINUE。不少服务不支持暂停或继续,就必须自 己决定在服务中它是否可用。若是你容许一个SCP去中止服务,就要设置它为SERVICE_ACCEPT_STOP。若是服务要在操做系统关闭的时候获得 通知,设置它为SERVICE_ACCEPT_SHUTDOWN能够收到预期的结果。这些标志能够用“|”运算符组合。操作系统
dwWin32ExitCode和dwServiceSpecificExitCode:是 容许服务报告错误的关键,若是但愿服务去报告一个Win32错误代码(预约义在WinError.h中),它就设置dwWin32ExitCode为须要 的代码。一个服务也能够报告它自己特有的、没有映射到一个预约义的Win32错误代码中的错误。为了这一点,要把dwWin32ExitCode设置为 ERROR_SERVICE_SPECIFIC_ERROR,而后还要设置成员dwServiceSpecificExitCode为服务特有的错误代码。当服务运行正常,没有错误能够报告的时候,就设置成员dwWin32ExitCode为NO_ERROR。指针
dwCheckPoint和dwWaitHint:是 一个服务用来报告它当前的事件进展状况的。当成员dwCurrentState被设置成SERVICE_START_PENDING的时候,应该把 dwCheckPoint设成0,dwWaitHint设成一个通过屡次尝试后肯定比较合适的超时毫秒数,这样服务才能高效运行。一旦服务被彻底初始化, 就应该从新初始化SERVICE_STATUS结构的成员,更改dwCurrentState为SERVICE_RUNNING,而后把 dwCheckPoint和dwWaitHint都改成0。【MSDN:Estimated time required for a pending start, stop, pause, or continue operation, in milliseconds. Before the specified amount of time has elapsed, the service should make its next call to the SetServiceStatus function with either an incrementeddwCheckPoint value or a change in dwCurrentState. If the amount of time specified by dwWaitHint passes, anddwCheckPoint has not been incremented ordwCurrentState has not changed, the service control manager or service control program can assume that an error has occurred and the service should be stopped.】在dwWaitHint指定的超时时间到达以前,服务应该进行新的一次::SetServiceStatus()函数的调用,递增 dwCheckPoint或者改变dwCurrentState,若是dwWaitHint指定的超时时间已通过去(已经超时),既没有递增 dwCheckPoint,又没有改变dwCurrentState,则服务控制管理器(SCM)或者服务控制程序(SCP)将假设一个错误已经发生,且 服务应该中止。htm