使用Delphi创建Windows服务

7

我在Delphi中创建了一个Windows服务。我的代码在ServiceExecute中运行。

procedure TMyService.ServiceExecute(Sender: TService);
 while not Terminated do
 begin
      CallSomeProcedure;  
      Sleep(1000);
      ServiceThread.ProcessRequests(false);
 end;
end;

很遗憾,我无法运行这段代码。即使在调试时,它似乎也没有调用该过程。Myservice.exe中的代码如下。

begin 
    if not Application.DelayInitialize or Application.Installing then
       Application.Initialize;
    Application.CreateForm(TMyService, MyService);
    Application.Run;
end.

如果我添加 ,我就可以运行serviceExecute。
MyService.ServiceExecute(nil);

把 MyService.exe 安装为服务后,似乎不能作为应用程序运行,因为 Application.Run 没有任何反应。

不确定我做错了什么,但任何帮助将不胜感激。

谢谢。


1
我觉得那里看起来没有问题。 - David Heffernan
3个回答

8

您不能仅通过IDE运行服务来进行调试;在这种情况下,它只会退出。服务必须由服务控制管理器启动。此外,您不应该直接调用ServiceExecute。

这里是有关如何调试服务的文档


谢谢您的快速回复。我已经成功进入调试模式,但我现在遇到了使用ADOQuery时的一些问题。现在我可以进行调试并解决这个问题。谢谢。 - user761275

5
如果您已经创建了一个服务,可以通过带有参数 /install 的运行文件来安装它。
之后,该服务应显示在其他服务之间(转到开始/运行,输入services.msc)。
然后您可以启动它,并且可以通过将调试器附加到它来进行调试。
但是,像那样工作非常繁琐。我不敢相信有些人真的像那样工作。我通常将所有的业务逻辑都放在单独的单元中,可以从“正常”应用程序中运行。只有当这种方式运行良好时,我才将其包装成服务并尝试。
有时我甚至会创建一个既可以作为服务又可以使用GUI运行的应用程序。您只需要实例化您的服务类。您只需要自己启动它,但是调试将变得更容易。

1

svCom不仅仅是调试工具,它是一个完整的服务框架,可以替代TService。在我的TService项目中,我只需在OnStart事件处理程序的开头放置一个IsDebuggerPresent()循环,然后在SCM启动服务进程后将调试器附加到该进程即可。这样就可以正常工作了。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接