为什么我的Delphi服务应用程序没有启动?

时间:2013-07-22 21:15:16

标签: delphi windows-services delphi-xe3

我使用向导创建了一个新的Windows Service项目,推出了一些代码,编译了它,用/INSTALL运行它然后我尝试使用net start myservice启动它但是我有一个service name not found错误;然后我进入了服务中的控制面板,当我尝试开始单击“开始”链接时,对话框窗口会无限期地显示50%的进度条冻结。

这是我第一次尝试提供服务来更新我正在开发的主系统,并且为了测试,我每隔一分钟放一个Timer来告诉时间。任何人都可以注意到什么是错的,为什么会这样?

DPR文件:

{...}
begin
  if not Application.DelayInitialize or Application.Installing then
  begin
    Application.Initialize;
  end;
  Application.CreateForm(TZeusUpdateSevice, ZeusUpdateSevice);
  Application.Run;
end.

PAS文件:

{...}
procedure ServiceController(CtrlCode: DWord); stdcall; 
begin
  ZeusUpdateSevice.Controller(CtrlCode);
end;

function TZeusUpdateSevice.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TZeusUpdateSevice.ServiceAfterInstall(Sender: TService);
var
  regEdit : TRegistry;
begin
  regEdit := TRegistry.Create(KEY_READ or KEY_WRITE);
  try
    regEdit.RootKey := HKEY_LOCAL_MACHINE;

    if regEdit.OpenKey('\SYSTEM\CurrentControlSet\Services\' + Name,False) then
    begin
      regEdit.WriteString('Description','Mantém atualizados os arquivos e as credenciais da Plataforma Zeus.');
      regEdit.CloseKey;
    end;

  finally
    FreeAndNil(regEdit);
  end;
end;

procedure TZeusUpdateSevice.ServiceStart(Sender: TService; var Started: Boolean);
begin
{ executa os processos solicitados pelo sistema }
  Timer1.Enabled := True;
  while not Terminated do ServiceThread.ProcessRequests(True);
  Timer1.Enabled := False;
end;

procedure TZeusUpdateSevice.Timer1Timer(Sender: TObject);
begin
  ShowMessage('Now, time is: ' + TimeToStr(Now));
end;

1 个答案:

答案 0 :(得分:12)

有几个明显的问题:

  1. OnStart事件中有一个无限循环。此事件允许您在服务启动时执行一次操作。该代码属于OnExecute。
  2. 服务无法显示UI,因此ShowMessage无法正常工作。您需要使用非可视机制来提供反馈。
  3. 由于您的OnStart未返回,因此SCM将您的服务视为尚未启动。所以我猜上面的第1项是关于为什么你的服务无法启动的解释。