我何时使用ExitProcess()函数在c ++中停止服务

时间:2009-06-10 16:04:28

标签: c++ service

我在我的应用程序中停止服务想知道它的用法是什么 ExitProcess,如果我应该使用它

4 个答案:

答案 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来响应,但最好是使用某种形式的关闭来关闭任何必要的东西并记录下来。