双击Windows Service可执行文件进行配置

时间:2018-12-11 09:43:02

标签: delphi windows-services

我用Delphi IDE的模板编写了一个Delphi Win32 Windows Service应用程序,在从“服务”控制面板安装和启动后,它运行良好。

现在,我想为它编写一个配置应用程序,我认为可能是,只需双击其可执行文件,它就可以成为其自身的配置器。

我之所以这样认为是因为,双击该服务可以以某种方式区分出它不是由服务控制管理系统执行的。

这是我的问题:

  1. “服务”应用如何区分简单运行和作为服务运行?
  2. 是否可以将简单运行用于服务模式以外的其他操作?这会打扰到服务模式吗?

1 个答案:

答案 0 :(得分:6)

回答您的问题:

  

“服务”应用如何区分简单运行和   服务吗?

查看单元TServiceApplication.CreateFormVcl.SVcMgr后面的代码

  

是否可以将简单运行用于服务以外的其他操作   模式?

是,请参见下面的答案

  

这种干扰是否会在服务模式下起作用?

您需要做的就是将Service源代码(.dpr文件)更改为以下内容:

 begin
  if FindCmdLineSwitch('config', ['-', '/'], True) then
   TMyForm.Run
  else
   begin
    if not Application.DelayInitialize or Application.Installing then
     Application.Initialize;
    Application.CreateForm(TSvc_MyService, Svc_MyService);
    Application.Run;
   end;
end.

其中TMyForm.Run在我的主要GUI窗体上定义为类过程:

class procedure TMyForm.Run;
begin
 TThread.NameThreadForDebugging('FormRunner');
 ReportMemoryLeaksOnShutdown := DebugHook <> 0;
 Forms.Application.Initialize;
 Forms.Application.ShowMainForm := True;
 Forms.Application.MainFormOnTaskBar := True;
 Forms.Application.CreateForm(TMyForm, MyForm);
 Forms.Application.Run;
end;

因此,当您使用标志/ config(或-config)启动服务可执行文件时,它将作为普通表单应用程序启动。

更新

在这里更可能做出区分:

procedure TServiceStartThread.Execute;
begin
  if StartServiceCtrlDispatcher(FServiceStartTable[0]) then
    ReturnValue := 0
  else
    ReturnValue := GetLastError; //Code 1063 if started like an app
end;

这将导致WM_QUIT消息被发布到消息队列。

以下循环在收到WM_QUIT消息时终止。

procedure TServiceApplication.Run;
.....
begin
  .....
  while not Vcl.Forms.Application.Terminated do
  try
    Vcl.Forms.Application.HandleMessage;
  except
    on E: Exception do
      DoHandleException(E);
  end;
  .....
end;

有关此主题的更多信息: