| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > простенький шаблон сервиса |
| Автор: 12usver12 7.9.2007, 20:42 |
| подскажите, где можно взять исходник шаблона сервиса. Пустышки. Чтобы например сервис, который просто пикает если его стартанешь, и прекращает и завершается когда его остановишь. Желательно на Visual Studio 8. А то по инету вроде так много исходников, но все они или под шестую студию, или под седьмую. И у всех одна и та же ошибка: 1063 — Процесс службы не может установить связь с контроллером службы |
| Автор: 12usver12 7.9.2007, 23:24 | ||
| привет, Tectoder нет, сервис устанавливается по всем правилам - например, через командную строку. Запускаетмя вручную в "Службах". В качестве выполняемой задачи (для примера) поставлен Beep. Есть булевая переменная, которая при старте службы принимает истину, при остановке - ложь. И когда переменная принимает истину, запускается бип (в ServiceMain) При запуске уже самой службы (не сервиса) начинает беспрерывно пищать, на полпути зависает, и выдается сообщение наподобие, что служба остановлена, тк не ответила вовремя. И потом эту службу приходится выдирать из диспетчера. Или, например, как можно при помощи сервиса реализовать вот такое:
PS. если что, могу выложить исходник |
| Автор: Tectoder 8.9.2007, 09:40 |
| MessageBox(0,"AAA","BBB",MB_SERVICENOTIFICATION); Для вывода самое простое. Пойдет? |
| Автор: Damarus 8.9.2007, 12:08 | ||
Служба должна уведомлять систему о своём состоянии |
| Автор: 12usver12 8.9.2007, 16:42 |
| Может, посмотрите что тут не так? |
| Автор: Pulse69 9.9.2007, 03:12 | ||||||
| 12usver12, привет. Посмотрел код и вот какие замечания. В функции ServiceMain Вы переводите службу в состояние "запуск".
Сразу после этого Вы запускаете рабочий цикл сервиса, который действует пока не было получено сообщения SERVICE_CONTROL_STOP, хотя перед основным циклом сервис нужно перевести в состояние SERVICE_RUNNING.
Иначе, диспетчер сервисов посчитает, что служба зависла при запуске (у Вас WaitHint на 4 секунды, а повторных вызовов с увеличением CheckPoint не было). Ещё один момент. После получения сигнала SERVICE_CONTROL_STOP Вы сразу же переводите службу в состояние "остановлена", не оставляя функции ServiceMain ни малейшего шанса выполниться до конца. Я бы рекомендовал не останавливать службу после получения сигнала SERVICE_CONTROL_STOP, а устанавливать флаг IsRunning (вообще, каким-нибудь методом прервать выполнение, если это возможно). После этого, основной цикл завершится, и можно будет провести деинициализацию всех выделенных ресурсов. Иначе, при остановке службы могут возникнуть ошибки (естественно, когда она уже обзаведётся солидным функционалом).
И последнее. В коде я увидел попытки, хотя и закомментированные, работы с консолью из службы. По-хорошему, в сервисе вообще не должно быть пользовательского ввода-вывода. А если нет залогиненых пользователей, с кем тогда сервис будет общаться? PS: Указанная ошибка 1063 не появляется, если службу запускать по всем правилам, а не двойным щелчком на экзешнике. |
| Автор: 12usver12 9.9.2007, 11:49 |
| привет, Pulse69 спасибо за такие ценные замечания! все отлично пошло, пишется при запуске в файл. а для работы с той же консолью как реализовать? создать еще одно приложение, которое будет требовать от пользователся ввода данных, и в сервисе например при помощи того же CreateProcess(...) запускать консольное приложение? В котором есть пользовательский ввод-вывод? |
| Автор: Pulse69 9.9.2007, 12:36 |
| Да, если нужно взаимодействие, пишется отдельное приложение, которое общается со службой любым способом, который подойдёт: контрольные сообщения сервиса, сокеты, именованные каналы, и т.д. Его можно или занести в автозагрузку для нужных пользователей, или предложить им запускать эту программку самостоятельно. |
| Автор: 12usver12 9.9.2007, 23:35 |
| Большое спасибо за помощь, все чудесно пошло, сервер запускается ввиде службы, и читает номер порта из файла Удачи |