我知道這可以在C#/ .Net中完成,但我想知道是否可以調用Windows API?以編程方式重新啓動Windows服務
我有一個服務將爲DHCP請求提供服務,當我想更新服務的配置時,我需要停止服務,重寫其INI文件,然後重新啓動服務。
任何幫助表示讚賞!
我知道這可以在C#/ .Net中完成,但我想知道是否可以調用Windows API?以編程方式重新啓動Windows服務
我有一個服務將爲DHCP請求提供服務,當我想更新服務的配置時,我需要停止服務,重寫其INI文件,然後重新啓動服務。
任何幫助表示讚賞!
在dos框中,net start [service]
會做你所需要的。如果您找不到API解決方案,則始終可以使用start [service]
作爲參數啓動net.exe
的過程。
當然,有一大堆的C API函數參見http://msdn.microsoft.com/en-us/library/ms682108%28v=vs.85%29.aspx。
你是否想找這樣的產品:Starting and stopping services?
您需要打開服務控制管理器(OpenSCManager),然後打開服務本身(OpenService),最後讓它自己啓動(StartService)。關閉你沿途使用的所有手柄,然後完成。
哇,在C++處理服務真的需要我回來......
祝你好運,
您也可以爲此use WMI。該鏈接的示例代碼是VB,但在Windows上移植到任何語言都應該很容易。
如果您在Windows上進行自動化,WMI很好學,因爲它爲系統上大多數有趣的對象提供了一個與語言無關的面向對象的接口。
我遲到了,但我會建議官方詳細的例子,爲啓動和停止服務。在這裏其他的答案的優勢在於它們包括錯誤處理,邊緣案件和相關服務 -
停止: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
有時你想重新從服務本身的服務。這個解決方案爲我工作。爲了清楚起見,我省略了相當微不足道的定時器代碼。請注意,此解決方案僅適用於因爲調用者是服務而且運行在較高級別的情況。
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());
}
}