Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> простенький шаблон сервиса 
V
    Опции темы
12usver12
Дата 7.9.2007, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 5.1.2007

Репутация: 1
Всего: 1



подскажите, где можно взять исходник шаблона сервиса. Пустышки. Чтобы например сервис, который просто пикает если его стартанешь, и прекращает и завершается когда его остановишь. Желательно на Visual Studio 8. А то по инету вроде так много исходников, но все они или под шестую студию, или под седьмую. 
И у всех одна и та же ошибка: 1063 — Процесс службы не может установить связь с контроллером службы
PM MAIL   Вверх
Tectoder
Дата 7.9.2007, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 202
Регистрация: 13.3.2007

Репутация: 7
Всего: 8



Цитата(12usver12 @  7.9.2007,  20:42 Найти цитируемый пост)
И у всех одна и та же ошибка: 1063 — Процесс службы не может установить связь с контроллером службы 
Процесс службы запускался двойным щелчком по экзешнику, видимо?
А должен через апплет services или еще как нибудь
PM   Вверх
12usver12
Дата 7.9.2007, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 5.1.2007

Репутация: 1
Всего: 1



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

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


PS. если что, могу выложить исходник
PM MAIL   Вверх
Tectoder
Дата 8.9.2007, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 202
Регистрация: 13.3.2007

Репутация: 7
Всего: 8



MessageBox(0,"AAA","BBB",MB_SERVICENOTIFICATION);
Для вывода самое простое. Пойдет?
PM   Вверх
Damarus
Дата 8.9.2007, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 4
Всего: 29



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

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

Это сообщение отредактировал(а) Damarus - 8.9.2007, 12:09
PM MAIL ICQ Jabber   Вверх
12usver12
Дата 8.9.2007, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 5.1.2007

Репутация: 1
Всего: 1



Может, посмотрите что тут не так?

Присоединённый файл ( Кол-во скачиваний: 23 )
Присоединённый файл  text.rar 10,23 Kb
PM MAIL   Вверх
Pulse69
Дата 9.9.2007, 03:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 28.4.2006
Где: Хабаровск

Репутация: 8
Всего: 10



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 не появляется, если службу запускать по всем правилам, а не двойным щелчком на экзешнике.


Это сообщение отредактировал(а) Pulse69 - 9.9.2007, 03:13
--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
12usver12
Дата 9.9.2007, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 5.1.2007

Репутация: 1
Всего: 1



привет, Pulse69
спасибо за такие ценные замечания!
все отлично пошло, пишется при запуске в файл.
а для работы с той же консолью как реализовать?
создать еще одно приложение, которое будет требовать от пользователся ввода данных, и в сервисе например при помощи того же CreateProcess(...) запускать консольное приложение? В котором есть пользовательский ввод-вывод?
PM MAIL   Вверх
Pulse69
Дата 9.9.2007, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 28.4.2006
Где: Хабаровск

Репутация: 8
Всего: 10



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

--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
12usver12
Дата 9.9.2007, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 5.1.2007

Репутация: 1
Всего: 1



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

Удачи
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0475 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.