【问题标题】:How an application can start its own service after it closes in Delphi?应用程序在 Delphi 中关闭后如何启动自己的服务?
【发布时间】:2012-05-23 12:05:29
【问题描述】:

我有一个应用程序,用户可以通过两种不同的方式启动它,作为普通应用程序或作为 Windows 服务。当服务已经在运行时(系统托盘中有一个图标)并且用户尝试启动应用程序(不仅仅是通过单击托盘图标打开,而是再次单击开始>应用程序>等等开始),它说:“应用程序已经作为服务运行,你想关闭服务并启动应用程序吗?”当用户点击“是”时,应用程序关闭服务并正常启动自己应用。

当发生这种情况时,我放置了一个标志,表明用户曾经停止过服务,当他们关闭应用程序时,软件会看到该标志并且服务必须重新开始运行,因为它在作为普通应用程序启动之前已关闭.

我试着说:

WinExec(PChar('NET START MyApplicationName'),SW_shownormal);

OnClose 事件中,这一行之前:

ExitProcess(0);

但它说服务已经在运行并关闭应用程序而不启动服务,如果我把它放在该行之后,它根本不会做任何事情。
有没有办法做到这一点?

当我将这一行放在ExitProcess(0); 之前时,它会打开一个带有以下消息的 cmd 窗口:

“服务没有响应控制功能”

然后它关闭应用程序,关闭 cmd 窗口并且它不启动服务。

【问题讨论】:

  • 您通过调用StartService 来启动服务。但是标准用户不能启动和停止服务。您的设计将强制应用以管理员身份运行,或者生成一个单独的提升进程来启动服务,并引发 UAC 对话框。对我来说,让服务始终运行并让它与作为前端的标准应用一起工作会更有意义。
  • 在调用 ExitProcess 之后它什么都不做我并不感到惊讶。
  • ExitProcess(0) 基本上是在杀死应用程序,之后就不可能发生其他事情了。
  • “当他关闭应用程序时,软件会看到标志并且服务必须重新开始运行”——如果应用程序在我告诉它退出时故意重新启动,我会开始寻找卸载程序.
  • @hvd 如果应用程序作为服务启动并且用户在服务模式下关闭应用程序将结束。如果作为服务启动,则用户作为普通应用程序打开服务停止并且普通应用程序打开,然后当用户关闭它时应用程序结束并且服务再次开始运行。因为如果应用程序作为服务启动,它必须一直运行,直到用户在服务模式下关闭应用程序,而不是在“正常模式”下。

标签: windows delphi service


【解决方案1】:

在我看来,您使问题过于复杂。启动和停止服务是一项复杂的操作,而且对于非管理员用户来说,默认情况下是禁止的。这一事实将使您的应用程序使用起来非常烦人。您将限制其对管理员用户的使用,并且还使用 UAC 对话框对他们进行装饰。没有人喜欢这样的应用。

另一种方法是让您的服务一直运行,但在标准桌面应用程序运行时使其处于非活动状态。当桌面应用程序启动时,它会使用某种形式的 IPC 与服务进行通信,并要求服务停止工作。该服务执行此操作,然后桌面应用程序继续执行。当桌面应用程序关闭时,会要求该服务恢复工作。您可能希望始终保持通信通道打开,以防止桌面应用程序异常终止 - 如果发生这种情况,服务将简单地重新启动。

现在,如果您真的想做好工作,您可以让所有工作处理始终在服务中进行。桌面应用程序只是服务的前端。在我看来,这似乎是这个应用程序最有效和最合乎逻辑的设计。

【讨论】:

    【解决方案2】:

    像这样写一个简单的批处理文件

    @ECHO OFF
    ping 1.1.1.1 -n 1 -w 10000 > NUL
    NET START MyApplicationName
    

    然后在关闭程序之前运行执行这个批处理文件。

    ShellExecute(0, 'Open', YourBatchFile, nil, nil, SW_HIDE)
    

    【讨论】:

    • 如果没有网络连接,Ping 将立即返回错误,除非您没有 ping 本地主机。解决方法:ping 127.0.0.1 -n 10 > NUL,但这是一个实现细节,连续 ping 等待 1 秒。
    • 这正是我想要的,谢谢! (David Heffernan 的回答也很棒,但我正在另一个人的项目中工作,这是一个大项目,所以我无法对其进行重大更改,而且我没有时间去做,但也感谢 David!)。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多