Преобразование программы на С++ в службу Windows?
Я написал консольную программу, которая "делает вещи" - в основном, используя boost. Как преобразовать его в службу Windows?
Что я должен знать о Windows Services заранее?
Ответы
Ответ 1
Хороший пример того, как настроить минимальную службу в MSDN. См. Части о написании основной функции, точки входа, а также пример кода.
После того, как у вас есть встроенная и работающая служба Windows, вы обнаружите следующую важную информацию: это боль для отладки. Там нет терминала (и, следовательно, нет stdout/stderr), и как только вы попытаетесь запустить исполняемый файл, он фактически запускает службу и возвращается вам.
Один трюк, который я нашел очень полезным, - это добавить параметр -foreground
к вашему приложению, чтобы, если вы запустили этот флаг, он обходит код стартового сервиса и вместо этого работает как обычное консольное приложение, что значительно расширяет его легче отлаживать. В VS.Net настройте параметры отладки для вызова этого флага.
Ответ 2
Вот действительно хороший пример в msdn здесь
Это проект сервисной плиты С++, который имеет функцию самонастройки/удаления и регистрирует события запуска и остановки службы в журнале событий Windows. Его можно остановить и запустить через приложение служб (snapin), как и другие сервисы. Возможно, вы захотите сначала предоставить ему права LocalSystem, чтобы увидеть, как он работает, так как на xp по крайней мере у него недостаточно прав для начала с предоставленными проектом правами LocalService. Проект Visual Studio 2008 в противном случае исходит из коробки, несмотря на загруженные инструкции, подразумевающие в противном случае.
Немного поздно, но я надеюсь, что это поможет кому-то другому.
Ответ 3
Возможно, вы сможете "обернуть его" с помощью этого инструмента из CodeProject:
http://www.codeproject.com/KB/system/xyntservice.aspx
Стоит посмотреть.
Ответ 4
Простейшим решением может быть создание нового проекта службы Windows в Visual Studio и копирование кода в новый проект.
Если вы реорганизуете свой код, чтобы разделить пользовательский интерфейс (в данном случае консоль) с логикой, вы могли бы создать библиотеку, которая выполняет эту работу, а затем вызывать ее как из проекта консоли, так и из проекта службы.
Ответ 5
Вы можете настроить приложение для запуска в качестве службы с помощью инструмента Srvany, который является частью Windows Resource Kit Resource Kit Tools.
Ответ 6
Srvany позволяет одновременно использовать только одну услугу. Поэтому я пишу свой srvany (sFany), чтобы nginx и php-cgi выполнялись как службы Windows вместе. Вот источник https://github.com/stxh/sFany