我有一些我用delphi编写的
Windows服务,它们通常工作得很好,但有时我会得到一个可以被视为致命的异常抛出.发生这种情况时,该服务旨在停止.
我的问题是如何以这样的方式退出服务,即SCM将自动尝试重新启动服务. (我已经在服务管理器中设置了服务的恢复选项)
MSDN州
A service is considered Failed when it terminates without reporting a status of SERVICE_STOPPED to the service controller.
我已经阅读了这篇文章Using the Automatic Recovery Features of Windows Services,但我不知道如何在delphi中实现这一点.
我已经尝试了以下几点
>将TService的ErrCode属性设置为非零值.
>将ServiceStop事件的已停止参数设置为false.
>在servicestop事件处理程序中引发异常.
这是我正在使用的代码,
procedure TTestService.ServiceExecute(Sender: TService); begin while not (Terminated or FFatalError) do begin ServiceThread.ProcessRequests(False); ReportStatus; Sleep(100); end; if FFatalError then Halt(1); end;
FFatalError是TTestService类上的私有布尔字段,在启动时初始化为false,如果工作线程(在TTestService.ServiceStart事件中启动)以致命异常终止,则它仅设置为true.
这是工作线程的OnTerminate事件处理程序.
procedure TTestService.ThdTerm(Sender: Tobject); var E : Exception; Thread : TThread; begin Thread := TThread(Sender); if (Thread.FatalException <> nil) then begin E := Exception(Thread.FatalException); GetExcCallStack(E); EventLog.LogError(Thread.ClassName + ': ID:'+ IntToStr(Thread.ThreadID) + ' Stopped Unexpectedly!,'+ NEWLINE + E.ClassName +': ' + E.Message); FFatalError := True; end; end;