我在我的应用程序中停止服务想知道它的用法是什么 ExitProcess,如果我应该使用它
答案 0 :(得分:2)
查看 OpenSCManager() , OpenService() 和 ControlService() Windows API调用。请注意,您的程序可能没有必要的权限来调用它们,因此可能需要提升 - 有关详细信息,请参阅Service Security and Access Rights。
还有一个例子how to stop a service。
答案 1 :(得分:2)
您永远不需要使用ExitProcess()
来停止服务。实际上,您根本不需要使用ExitProcess()
。
服务与SCM密切相关,如果它认为应该运行的服务消失,则需要采取一些措施来修复它。在极端情况下,它会强制系统重新启动。
停止服务的正确方法是使用记录的API要求SCM要求服务停止。此过程通常需要几秒钟才能完成,因为在询问其工作线程完成并停止后,服务本身通常需要进行干净关闭。
与SCM交互所需的权限比结束任意进程所需的权限要小,但通常都不会在Administrators组之外授予权限。
编辑:评论询问是否要从内部停止服务。
这可能是一个艰难的要求,特别是如果服务处于某种不幸的状态。服务和SCM绝对必须同意服务正在停止,或者SCM将采取为服务配置的恢复操作。
我确实有一个完整的服务实现,可以作为如何处理其中一些事情的另一种观点。它是LuaService并且是一个框架,它允许(单个工作线程)服务在纯Lua中实现,而不是LuaService可执行文件本身。其reference manual尝试完整记录内部,并记录服务生命周期的一些细节,这些细节通过MSDN上各种文章的交互进行记录。
答案 2 :(得分:1)
我看到这里的帖子都没有真正回答原来的问题。
RBerteig写道:“在极端情况下,它会强制系统重启。”
这是胡说八道。如果您终止WinLogon.exe,可能会发生这种情况,但对于一般的服务无效。
如果您停止其他应用程序的服务,您显然会使用
ControlService(mh_Service, SERVICE_CONTROL_STOP, &k_Status);
但是如果服务决定它的工作已经完成并且它想要自己关闭呢?
正确的方法是这样(如果您的服务不在共享进程中运行):
void cService::Suicide()
{
// Inform the Service Control Manager that the service is stopped now.
SERVICE_STATUS k_Status = {0};
k_Status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
k_Status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
k_Status.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(mh_Service, &k_Status);
ExitProcess(0);
}
我在我的服务类中使用此代码,它可以在从XP到Windows 10的任何Windows版本上完美运行。
!显然你应该在调用这个函数之前做任何清理工作!
答案 3 :(得分:0)
ExitProcess用于结束进程本身(很像ExitThread结束一个线程)。这用于结束进程(程序或DLL),但Microsoft不建议它结束DLL。
如果你试图阻止自己(你是这个过程),你可以使用ExisProcess,虽然我建议更清洁的关闭,以确保一切都干净地停止。与ExitThread一样,ExitProcess在不展开堆栈的情况下停止,因此不会调用析构函数。
在服务中,您可以根据外部信号停止。您可以通过调用ExitProcess来响应,但最好是使用某种形式的关闭来关闭任何必要的东西并记录下来。