我用Delphi IDE的模板编写了一个Delphi Win32 Windows Service应用程序,在从“服务”控制面板安装和启动后,它运行良好。
现在,我想为它编写一个配置应用程序,我认为可能是,只需双击其可执行文件,它就可以成为其自身的配置器。
我之所以这样认为是因为,双击该服务可以以某种方式区分出它不是由服务控制管理系统执行的。
这是我的问题:
答案 0 :(得分:6)
回答您的问题:
“服务”应用如何区分简单运行和 服务吗?
查看单元TServiceApplication.CreateForm
中Vcl.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;
有关此主题的更多信息: