我有一个应用程序,用户可以通过两种不同的方式启动,如普通应用程序或Windows服务。当服务已经运行时(系统托盘中有一个图标)并且用户尝试启动应用程序(不只是通过单击托盘图标打开,而是再次单击开始>应用程序> Blah blah),它说:“应用程序已作为服务运行,您要关闭服务并启动应用程序吗?”当用户单击“是”时,应用程序将关闭服务并以正常方式启动应用
当发生这种情况时,我会设置一个标志,指示用户曾停止过该服务,当他们关闭应用程序时,软件会看到该标志并且该服务必须再次开始运行,因为它在关闭之前作为普通应用程序启动
我试着说:
WinExec(PChar('NET START MyApplicationName'),SW_shownormal);
在OnClose
事件中,在此行之前:
ExitProcess(0);
但它表示该服务已在运行并关闭应用程序而不启动该服务,如果我将其放在该行之后它根本不执行任何操作。
有没有办法做到这一点?
当我将该行放在ExitProcess(0);
之前时,它会打开一个带有消息的cmd窗口:
“服务没有响应控制功能”
然后关闭应用程序,关闭cmd窗口,它不会启动服务。
答案 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)