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

时间:2012-05-23 12:05:30

标签: windows delphi service

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

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

我试着说:

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

OnClose事件中,在此行之前:

ExitProcess(0);

但它表示该服务已在运行并关闭应用程序而不启动该服务,如果我将其放在该行之后它根本不执行任何操作。
有没有办法做到这一点?

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

  

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

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

2 个答案:

答案 0 :(得分:7)

在我看来,你的问题太复杂了。启动和停止服务是一项复杂的操作,实际上非默认情况下禁止非管理员用户使用。这个事实会让你的应用程序非常烦人。您将限制其用户管理员用户,并使用UAC对话框加密它们。没有人喜欢这样的应用程序。

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

现在,如果你真的想做好工作,你可以让所有的工作处理都发生在服务中。桌面应用程序仅仅是服务的前端。在我看来,这是该应用程序最有效和最合理的设计。

答案 1 :(得分:0)

编写一个简单的批处理文件

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

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

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