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