gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:59:18 25 4
gpt4 key购买 nike

我有一个应用程序,用户可以通过两种不同的方式启动它,作为普通应用程序或作为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com