Delphi XE服务不会启动:错误1053

时间:2014-09-30 08:36:07

标签: delphi service

我在Delphi XE中提供的服务在Windows 7中的服务管理器提示时无法启动,我得到了

Error 1053: The service did not respond to the start or control reqquest in a timely fashion

我将服务连接到AfterInstall和OnExecute事件,这是我的事件代码:

procedure TAarhusRunner.ServiceAfterInstall(Sender: TService);
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create(KEY_READ or KEY_WRITE);
  try

    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if Reg.OpenKey('\SYSTEM\CurrentControlSet\Services\' + Name, false) then
    begin
      Reg.WriteString('Description', 'Worker Service for Inversion Job Distribution');
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
end;

procedure TAarhusRunner.ServiceExecute(Sender: TService);
begin
  try
    Self.Status := csRunning;

    //start the loop
    MainTimer.Interval := 5000; //MainTimer is declared in the .dfm
    MainTimer.Enabled := True;
    RecheckAndApplyTimer.Enabled := False;
    while not Terminated do
    begin
       ServiceThread.ProcessRequests(true);
       MainTimer.Enabled := False;
    end;

  except
    on e: Exception do begin
      MessageDlg(E.Message,mterror,[mbok],0);
      exit;
    end;
  end;
end;

谁能告诉我我做错了什么?

2 个答案:

答案 0 :(得分:4)

你使用

ServiceThread.ProcessRequests(True);

在您的服务循环中,WaitForMessage设置为True。 这将阻止你的循环,因为它将无限期地等待服务消息。

要解决您的问题,只需将您的行更改为:

ServiceThread.ProcessRequests(False);

一些一般性建议:

不要实现服务的OnExecute处理程序,而是在OnStart eventhandler中生成一个线程。从OnStop Eventhandler终止此线程。 可以找到更多详细信息here

使用非GUI线程中的TTimer(就像您的情况中的服务线程一样)很棘手,但这并非不可能(David Heffernan有关于此主题的主题here on SO)。

答案 1 :(得分:0)

(解决) 结果是一个单元错误阻止服务响应。我将相关的.bpl包复制到了服务文件夹,这似乎解决了错误。

感谢大家花时间添加输入