windows - 应用程序如何在 Delphi 中关闭后启动自己的服务?

标签 windows delphi service

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

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

我试着把:

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

OnClose 事件中,在此行之前:

ExitProcess(0);

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

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

"The service is not responding to the control function"

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

最佳答案

在我看来,你把问题复杂化了。启动和停止服务是一项复杂的操作,而且对于非管理员用户来说默认情况下是禁止的。这个事实将使您的应用程序使用起来非常烦人。您会将它的使用限制为管理员用户,并用 UAC 对话框来填充它们。没有人喜欢这样的应用。

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

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

关于windows - 应用程序如何在 Delphi 中关闭后启动自己的服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10719546/

相关文章:

delphi - 是否可以像TWebBrowser一样在Delphi中使用Microsoft Edge(Chromium引擎)?

javascript - 我想使用 rxjs subject 来检测多个组件中的值变化。但它只显示改变它的组件的变化

python - 如何使用Python ping ip并仅获取Tk中的ms?

windows - 更改 Windows 文件夹中的文件名

delphi - 如何将接口(interface)类型传递给过程

api - 数据更新后下拉列表没有变化,因为两个API同时调用

service - PowerShell 2 中 sc start ... 和 Start-Service ... 之间的区别

windows - 如何在git中别名删除 merge 的分支

windows - 学习编写 Windows 驱动程序

delphi - 初始化时获取当前包名称