【问题标题】:Creating a Windows service in delphi在 delphi 中创建 Windows 服务
【发布时间】:2011-05-20 14:40:49
【问题描述】:

我在 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 什么都不做

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

谢谢

【问题讨论】:

  • 对我来说没有任何问题。

标签: delphi windows-services


【解决方案1】:

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

这里是documentation 如何调试服务。

【讨论】:

  • 感谢您的快速回复。我现在已经对其进行调试,但我正在使用的 ADOQuery 出现问题。现在应该可以解决问题了,我可以调试了。谢谢
【解决方案2】:

如果你已经创建了一个服务,你可以通过参数/install运行它来安装它

之后,该服务应显示在您的其他服务之间(转到start/run/ 并输入services.msc)。

然后您可以启动它,并且可以通过将调试器附加到它来调试它。

但是,这样工作很痛苦。我无法相信有些人实际上是这样工作的。我通常将所有业务逻辑放在可以从“正常”应用程序运行的单独单元中。只有当效果很好时,我才会将它包装在服务中并尝试。

有时我什至会创建一个既可以作为服务运行也可以通过 GUI 运行的应用程序。您可以简单地实例化您的服务类。你只需要自己启动它,但它会更容易调试。

【讨论】:

    【解决方案3】:

    有专门为简化服务调试过程而开发的commercial solution。您可以直接从 Delphi IDE 中debug your code,包括服务的 OnStart 事件。

    【讨论】:

    • svCom 不仅仅是调试。它是一个完整的服务框架,可以替代 TService。在我的 TService 项目中,我只是在 OnStart 事件处理程序的开头放置了一个IsDebuggerPresent() 循环,然后在 SCM 启动后将调试器附加到服务进程。工作正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多