以编程方式重新启动Windows服务

时间:2011-05-25 14:54:30

标签: c++ windows-services

我知道这可以在C#/ .Net中完成,但我想知道是否可以调用Windows API吗?

我有一个服务将为DHCP请求提供服务,当我想更新我需要停止服务的服务的配置时,重写其INI文件然后再次启动服务。

任何帮助表示赞赏!

8 个答案:

答案 0 :(得分:27)

  1. 使用OpenSCManager打开服务控制管理器。
  2. 使用OpenService打开要控制的服务。
  3. 使用ControlServiceControlServiceEx与SERVICE_CONTROL_STOP参数停止服务。
  4. 做你需要做的事。
  5. 使用StartService重新启动服务。
  6. 使用CloseServiceHandle关闭服务和SCM句柄。

答案 1 :(得分:5)

当然,有一大堆C API函数可以参见http://msdn.microsoft.com/en-us/library/ms682108%28v=vs.85%29.aspx

答案 2 :(得分:3)

您是否正在寻找类似的内容:Starting and stopping services

答案 3 :(得分:3)

您需要打开服务控制管理器(OpenSCManager),然后打开服务本身(OpenService)并最终要求它自己启动(StartService)。关闭你沿途使用的所有手柄,然后你就完成了。

哇,用C ++处理服务真的让我回来了......

祝你好运,

答案 4 :(得分:3)

我参加派对的时间已经很晚了,但我建议启动和停止服务的官方详细示例。这里的其他答案的优势在于它们包括错误处理,边缘情况和依赖服务 -

停止:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686335(v=vs.85).aspx 开始:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686315(v=vs.85).aspx

答案 5 :(得分:3)

有时您想从服务本身重新启动服务。这个解决方案对我有用。为清楚起见,我省略了相当简单的计时器代码。请注意,此解决方案仅适用于调用方是服务并且在较高级别运行。

void Watchdog::OnTimeout()
{
    STARTUPINFO si = { };
    si.cb = sizeof(STARTUPINFO);
    GetStartupInfo(&si);

    PROCESS_INFORMATION pi = { };

    // is modified by the call to CreateProcess (unicode version).
    TCHAR szCmdLine[] = _T("cmd.exe /C \"net stop <yourservicenamehere> & net start <yourservicenamehere>\"");

    // send shell command to restart our service.
    if (!CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
    {
        // do some error reporting...
        LOG("*** ERROR *** Watchdog timeout.  Restart attempt failed. Last error: 0x%x\n", GetLastError());
    }
}

答案 6 :(得分:2)

在dos框中,net start [service]可以满足您的需求。如果您没有找到API解决方案,则始终可以使用net.exe作为参数启动start [service]的流程。

答案 7 :(得分:2)

您也可以use WMI。该链接的示例代码是VB,但在Windows上移植到任何语言都应该很容易。

如果你是在Windows上进行自动化,WMI很好学,因为它为系统中的大多数有趣对象提供了一个与语言无关的面向对象的接口。