繁体   English   中英

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

[英]How an application can start its own service after it closes in Delphi?

我有一个应用程序,用户可以用两种不同的方式启动它,作为普通应用程序或Windows服务。 当该服务已经运行时(系统托盘中有一个图标),并且用户尝试启动该应用程序(不仅通过单击托盘图标打开,还再次单击开始>应用程序> Blah blah开始)。说:“ 该应用程序已经作为服务运行,您要关闭该服务并启动该应用程序吗? ”当用户单击“是”时,该应用程序将关闭该服务并以普通应用程序的身份启动。

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

我试图把:

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

OnClose事件中,在此行之前:

ExitProcess(0);

但是它说该服务已经在运行,并且在不启动该服务的情况下关闭了该应用程序,如果我将其放在该行之后,它什么也没做。
有什么办法吗?

当我将代码放在ExitProcess(0); 它打开一个带有消息的cmd窗口:

“服务未响应控制功能”

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

在我看来,您使问题变得更加复杂。 启动和停止服务是一项复杂的操作,实际上,默认情况下,非管理员用户禁止使用该服务。 这个事实将使您的应用程序非常烦人。 您将其使用限制为管理员用户,并且还可以使用UAC对话框来限制他们。 没有人喜欢这样的应用程序。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM