2

我使用向导创建了一个新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;
4

1 回答 1

12

有几个明显的问题:

  1. OnStart 事件中有一个无限循环。此事件允许您在服务启动时执行一次性操作。该代码属于 OnExecute。
  2. 服务无法显示 UI,因此 ShowMessage 无法工作。您需要使用非视觉机制来提供反馈。

因为您的 OnStart 没有返回,所以 SCM 认为您的服务尚未启动。所以我想上面的第 1 项是关于为什么您的服务无法启动的解释。

于 2013-07-22T21:24:43.937 回答