【发布时间】:2011-05-25 14:54:30
【问题描述】:
我知道这可以在 C#/.Net 中完成,但我想知道是否可以通过调用 Windows API 来完成?
我有一个服务 DHCP 请求的服务,当我想更新服务的配置时,我需要停止服务,重写其 INI 文件,然后重新启动服务。
任何帮助表示赞赏!
【问题讨论】:
标签: c++ windows-services
我知道这可以在 C#/.Net 中完成,但我想知道是否可以通过调用 Windows API 来完成?
我有一个服务 DHCP 请求的服务,当我想更新服务的配置时,我需要停止服务,重写其 INI 文件,然后重新启动服务。
任何帮助表示赞赏!
【问题讨论】:
标签: c++ windows-services
【讨论】:
当然,有一大堆 C API 函数,例如 http://msdn.microsoft.com/en-us/library/ms682108%28v=vs.85%29.aspx。
【讨论】:
有时您想从服务本身重新启动服务。这个解决方案对我有用。为了清楚起见,我省略了相当琐碎的计时器代码。请注意,此解决方案之所以有效,是因为调用者是一项服务并在更高级别上运行。
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());
}
}
【讨论】:
我参加聚会迟到了,但我会建议有关启动和停止服务的官方详细示例。与此处其他答案相比的优势在于它们包括错误处理、边缘情况和相关服务 -
停止: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
【讨论】:
在 dos 框中,net start [service] 可以满足您的需求。如果您没有找到 API 解决方案,您始终可以使用 start [service] 作为参数为 net.exe 启动一个进程。
【讨论】:
您是否正在寻找这样的东西:Starting and stopping services?
【讨论】:
您需要打开服务控制管理器 (OpenSCManager),然后打开服务本身 (OpenService),最后要求它自行启动 (StartService)。关闭你一路上使用的所有把手,然后你就完成了。
哇,用 C++ 处理服务真的让我回味无穷……
祝你好运,
【讨论】:
您也可以为此use WMI。该链接上的示例代码是 VB,但它应该很容易移植到 Windows 上的几乎任何语言。
如果您对 Windows 上的自动化感兴趣,那么 WMI 很适合学习,因为它为系统上大多数有趣的对象提供了一个语言中立的面向对象的接口。
【讨论】: