#c #windows-services
#c #windows-services
Вопрос:
Я знаю, что это можно сделать на C # / .Net, но мне было интересно, можно ли это сделать, вызвав Windows API?
У меня есть служба, которая будет обслуживать запросы DHCP, и когда я хочу обновить конфигурацию для службы, мне нужно остановить службу, переписать ее INI-файл и затем снова запустить службу.
Любая помощь приветствуется!
Ответ №1:
- Откройте диспетчер управления службами с помощью OpenSCManager.
- Откройте службу, которой вы хотите управлять, с помощью OpenService.
- Используйте ControlService или ControlServiceEx с параметром SERVICE_CONTROL_STOP, чтобы остановить службу.
- Делайте все, что вам нужно сделать.
- Используйте startService для перезапуска службы.
- Используйте CloseServiceHandle, чтобы закрыть дескрипторы службы и SCM.
Ответ №2:
Конечно, существует целая куча функций C API, смотрите, например http://msdn.microsoft.com/en-us/library/ms682108(v=vs.85).aspx.
Ответ №3:
Иногда требуется перезапустить службу из самой службы. Это решение сработало для меня. Я опустил довольно тривиальный код таймера для наглядности. Обратите внимание, что это решение работает только потому, что вызывающий объект является службой и выполняется на повышенном уровне.
void Watchdog::OnTimeout()
{
STARTUPINFO si = { };
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(amp;si);
PROCESS_INFORMATION pi = { };
// is modified by the call to CreateProcess (unicode version).
TCHAR szCmdLine[] = _T("cmd.exe /C "net stop <yourservicenamehere> amp; net start <yourservicenamehere>"");
// send shell command to restart our service.
if (!CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, amp;si, amp;pi))
{
// do some error reporting...
LOG("*** ERROR *** Watchdog timeout. Restart attempt failed. Last error: 0x%xn", GetLastError());
}
}
Ответ №4:
Я опаздываю на вечеринку, но я бы предложил официальные подробные примеры как для запуска, так и для остановки службы. Преимущество перед другими приведенными здесь ответами заключается в том, что они включают обработку ошибок, пограничные случаи и зависимые службы —
Остановка: http://msdn.microsoft.com/en-us/library/windows/desktop/ms686335 (v = против 85).aspx Запустить: http://msdn.microsoft.com/en-us/library/windows/desktop/ms686315 (v = против 85).aspx
Ответ №5:
В окне dos net start [service]
сделал бы то, что вам нужно. Если вы не нашли решение API, вы всегда можете запустить процесс для net.exe
использования start [service]
в качестве параметров.
Ответ №6:
Вы ищете что-то вроде этого: Запуск и остановка служб?
Ответ №7:
Вам нужно будет открыть диспетчер управления службами (OpenSCManager), затем открыть саму службу (OpenService) и, наконец, попросить ее запустить саму себя (startService). Закройте все дескрипторы, которые вы использовали на этом пути, и все готово.
Вау, обработка служб на C действительно возвращает меня назад…
Удачи,
Ответ №8:
Вы также можете использовать WMI для этого. Пример кода по этой ссылке — VB, но его должно быть довольно легко перенести практически на любой язык в Windows.
Если вы занимаетесь автоматизацией в Windows, WMI полезно изучить, поскольку он предоставляет объектно-ориентированный интерфейс, не зависящий от языка, для большинства интересных объектов в системе.