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

Nic*_*ick 15 c++ windows-services

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

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

任何帮助赞赏!

Fer*_*cio 30

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


Mic*_*Roy 5

有时您想从服务本身重新启动服务。这个解决方案对我有用。为清楚起见,我省略了相当琐碎的计时器代码。请注意,此解决方案之所以有效,仅是因为调用方是一项服务并在较高级别上运行。

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());
    }
}
Run Code Online (Sandbox Code Playgroud)