【发布时间】:2012-05-23 12:05:29
【问题描述】:
我有一个应用程序,用户可以通过两种不同的方式启动它,作为普通应用程序或作为 Windows 服务。当服务已经在运行时(系统托盘中有一个图标)并且用户尝试启动应用程序(不仅仅是通过单击托盘图标打开,而是再次单击开始>应用程序>等等开始),它说:“应用程序已经作为服务运行,你想关闭服务并启动应用程序吗?”当用户点击“是”时,应用程序关闭服务并正常启动自己应用。
当发生这种情况时,我放置了一个标志,表明用户曾经停止过服务,当他们关闭应用程序时,软件会看到该标志并且服务必须重新开始运行,因为它在作为普通应用程序启动之前已关闭.
我试着说:
WinExec(PChar('NET START MyApplicationName'),SW_shownormal);
在OnClose 事件中,这一行之前:
ExitProcess(0);
但它说服务已经在运行并关闭应用程序而不启动服务,如果我把它放在该行之后,它根本不会做任何事情。
有没有办法做到这一点?
当我将这一行放在ExitProcess(0); 之前时,它会打开一个带有以下消息的 cmd 窗口:
“服务没有响应控制功能”
然后它关闭应用程序,关闭 cmd 窗口并且它不启动服务。
【问题讨论】:
-
您通过调用
StartService来启动服务。但是标准用户不能启动和停止服务。您的设计将强制应用以管理员身份运行,或者生成一个单独的提升进程来启动服务,并引发 UAC 对话框。对我来说,让服务始终运行并让它与作为前端的标准应用一起工作会更有意义。 -
在调用
ExitProcess之后它什么都不做我并不感到惊讶。 -
ExitProcess(0)基本上是在杀死应用程序,之后就不可能发生其他事情了。 -
“当他关闭应用程序时,软件会看到标志并且服务必须重新开始运行”——如果应用程序在我告诉它退出时故意重新启动,我会开始寻找卸载程序.
-
@hvd 如果应用程序作为服务启动并且用户在服务模式下关闭应用程序将结束。如果作为服务启动,则用户作为普通应用程序打开服务停止并且普通应用程序打开,然后当用户关闭它时应用程序结束并且服务再次开始运行。因为如果应用程序作为服务启动,它必须一直运行,直到用户在服务模式下关闭应用程序,而不是在“正常模式”下。