Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > простенький шаблон сервиса


Автор: 12usver12 7.9.2007, 20:42
подскажите, где можно взять исходник шаблона сервиса. Пустышки. Чтобы например сервис, который просто пикает если его стартанешь, и прекращает и завершается когда его остановишь. Желательно на Visual Studio 8. А то по инету вроде так много исходников, но все они или под шестую студию, или под седьмую. 
И у всех одна и та же ошибка: 1063 — Процесс службы не может установить связь с контроллером службы

Автор: Tectoder 7.9.2007, 20:47
Цитата(12usver12 @  7.9.2007,  20:42 Найти цитируемый пост)
И у всех одна и та же ошибка: 1063 — Процесс службы не может установить связь с контроллером службы 
Процесс службы запускался двойным щелчком по экзешнику, видимо?
А должен через апплет services или еще как нибудь

Автор: 12usver12 7.9.2007, 23:24
привет, Tectoder 
нет, сервис устанавливается по всем правилам - например, через командную строку.
Запускаетмя вручную в "Службах". В качестве выполняемой задачи (для примера) поставлен Beep.
Есть булевая переменная, которая при старте службы принимает истину, при остановке - ложь.
И когда переменная принимает истину, запускается бип (в ServiceMain)
При запуске уже самой службы (не сервиса) начинает беспрерывно пищать, на полпути зависает, и выдается сообщение наподобие, что служба остановлена, тк не ответила вовремя. И потом эту службу приходится выдирать из диспетчера.
Или, например, как можно при помощи сервиса реализовать вот такое:
Код

char r = 'y';
do 
{
      cout << "Введите букву: ";
      cin >> r;
}while (r != 'y');


PS. если что, могу выложить исходник

Автор: Tectoder 8.9.2007, 09:40
MessageBox(0,"AAA","BBB",MB_SERVICENOTIFICATION);
Для вывода самое простое. Пойдет?

Автор: Damarus 8.9.2007, 12:08
Цитата(12usver12 @  8.9.2007,  00:24 Найти цитируемый пост)
и выдается сообщение наподобие, что служба остановлена, тк не ответила вовремя.

Служба должна уведомлять систему о своём состоянии smile 

Автор: 12usver12 8.9.2007, 16:42
Может, посмотрите что тут не так?

Автор: Pulse69 9.9.2007, 03:12
12usver12, привет.
Посмотрел код и вот какие замечания.

В функции ServiceMain Вы переводите службу в состояние "запуск".
Код

SetSomeServiceStatus(SERVICE_START_PENDING,NO_ERROR, 4000);


Сразу после этого Вы запускаете рабочий цикл сервиса, который действует пока не было 
получено сообщения SERVICE_CONTROL_STOP, хотя перед основным циклом сервис
нужно перевести в состояние SERVICE_RUNNING.
Код

SetSomeServiceStatus(SERVICE_RUNNING, NO_ERROR,  4000 );
while( IsRunning )
{

Иначе, диспетчер сервисов посчитает, что служба зависла при запуске (у Вас WaitHint на 4 секунды, а повторных вызовов с увеличением CheckPoint не было).

Ещё один момент.
После получения сигнала SERVICE_CONTROL_STOP Вы сразу же переводите службу  в состояние "остановлена", не оставляя функции ServiceMain ни малейшего шанса выполниться до конца. Я бы рекомендовал не останавливать службу после получения сигнала SERVICE_CONTROL_STOP, а устанавливать флаг IsRunning (вообще, каким-нибудь методом прервать выполнение, если это возможно).
После этого, основной цикл завершится, и можно будет провести деинициализацию всех выделенных ресурсов.
Иначе, при остановке службы могут возникнуть ошибки (естественно, когда она уже обзаведётся солидным функционалом).
Код

while( IsRunning )
{
     // что-то
}

//   Здесь освобождение ресурсов, закрытие файлов, и так далее.

SetSomeServiceStatus( SERVICE_STOPPED,  NO_ERROR, 0 );




И последнее.
В коде я увидел попытки, хотя и закомментированные, работы с консолью из службы. По-хорошему, в сервисе вообще не должно быть пользовательского ввода-вывода. А если нет залогиненых пользователей, с кем тогда сервис будет общаться? smile


PS:
Указанная ошибка 1063 не появляется, если службу запускать по всем правилам, а не двойным щелчком на экзешнике.

Автор: 12usver12 9.9.2007, 11:49
привет, Pulse69
спасибо за такие ценные замечания!
все отлично пошло, пишется при запуске в файл.
а для работы с той же консолью как реализовать?
создать еще одно приложение, которое будет требовать от пользователся ввода данных, и в сервисе например при помощи того же CreateProcess(...) запускать консольное приложение? В котором есть пользовательский ввод-вывод?

Автор: Pulse69 9.9.2007, 12:36
Да, если нужно взаимодействие, пишется отдельное приложение, которое общается со службой любым способом, который подойдёт: контрольные сообщения сервиса, сокеты, именованные каналы, и т.д. 
Его можно или занести в автозагрузку для нужных пользователей, или предложить им запускать эту программку самостоятельно.

Автор: 12usver12 9.9.2007, 23:35
Большое спасибо за помощь, все чудесно пошло, сервер запускается ввиде службы, и читает номер порта из файла

Удачи

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)