Форум программистов, компьютерный форум CyberForum.ru

Переделка программы в службу - C++

Восстановить пароль Регистрация
 
GBIT
 Аватар для GBIT
11 / 11 / 1
Регистрация: 05.10.2011
Сообщений: 219
03.05.2014, 23:36     Переделка программы в службу #1
Приветствую всех,
написал сетевую програмулину (оттестирована, возьмем за истину, что работает она стабильно и верно), решил попробовать сделать из программы службу.
погуглив как и что нашел ссылку на пример, как должен выглядеть шаблон службы. http://code.msdn.microsoft.com/windo...rvice-cacf4948
Немного поковырявшись нашел метод:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void CSampleService::ServiceWorkerThread(void)
{
    // Periodically check if the service is stopping.
    while (!m_fStopping)
    {
        // Perform main service function here...
 
        ::Sleep(2000);  // Simulate some lengthy operations.
    }
 
    // Signal the stopped event.
    SetEvent(m_hStoppedEvent);
}
конкретно интересует строка:
C++
1
::Sleep(2000);  // Simulate some lengthy operations.
как я понял - это есть место куда можно грубо говоря залить свой код на исполнение в службе.
все так и сделал, но, где-то я не прав. сетевая программа не работает, следовательно я предположил, что где-то я не туда, что-то залил.

вопрос очень расплывчатый: я правильно определил где собственно мой код должен располагаться? и почему не работает код.

по этой ссылке можно скачать шаблон службы
http://code.msdn.microsoft.com/windo...wsService).zip
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
03.05.2014, 23:41     Переделка программы в службу #2
а как она у вас "не работает"?
вообще никакой код не выполняется?
или выполняется, а вы не видите его работу?
или выполняется и что-то в рантайме отваливается и вы тоже этого не видите.
GBIT
 Аватар для GBIT
11 / 11 / 1
Регистрация: 05.10.2011
Сообщений: 219
03.05.2014, 23:59  [ТС]     Переделка программы в службу #3
DU,
во-первых программа сетевая и нее можно подконнектиться. в случае службы порт не открылся, коннекта нет
во-вторых программа в самом начале создает файл лога, и пишет туда события. в случае службы файл лога не создался

Добавлено через 10 минут
Возможно вопрос мой, слишком расплывчатый. Подскажите хоть может какой мануал по созданию службы
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
03.05.2014, 23:59     Переделка программы в службу #4
дебажить это дело надо.
можно начать с простого. воткнуть в место
// Perform main service function here...
::MessageBoxA(NULL, "dd", NULL, MB_OK);
если появляется, то до этого дела хотябы доходит. правда может оказаться так, что оно
не покажется из-за того, что гуевая штуку хотят вывести не из основного потока. это я хз.
можно вместо этого попробовать воткнуть assert(!"my_assert");.
ну или сразу по нормальному дебажится (аттачится и по строчно выполнять). на вскиндку сказать что-то сложно в вашей ситуации. с дебагом в винде дружите? в какой IDE работаете?
Убежденный
Системный программист
 Аватар для Убежденный
14180 / 6195 / 984
Регистрация: 02.05.2013
Сообщений: 10,311
Завершенные тесты: 1
04.05.2014, 12:20     Переделка программы в службу #5
Цитата Сообщение от GBIT Посмотреть сообщение
Подскажите хоть может какой мануал по созданию службы
Начните отсюда, это первоисточник:

Services (Windows)
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Создать службу очень просто:

1) Создаем пустой консольный проект, добавляем в него функцию main.
В этой функции единственное и достаточное - вызвать StartServiceCtrlDispatcher,
зарегистрировав рабочую функцию службы (ServiceMain).

2) В ServiceMain нужно, во-первых, вызвать RegisterServiceCtrlHandlerEx,
зарегистрировать обработчик событий (HandlerEx), а во-вторых, сообщить
диспетчеру служб о своем состоянии - SetServiceStatus c кодом SERVICE_RUNNING.

Когда служба завершает работу (выход из ServiceMain), нужно снова оповестить
диспетчер служб - SetServiceStatus с SERVICE_STOPPED.

3) В обработчике (HandlerEx) следует обрабатывать различные события, приходящие в
службу, прежде всего это команды остановки, паузы (если поддерживаются службой) и т.п.,
приходящие от диспетчера. В остальных случаях достаточно вернуть код NO_ERROR.

4) Зарегистрировать службу в системе можно с помощью функции CreateService.
Запуск службы - StartService, остановка (если поддерживается) - ControlService +
SERVICE_CONTROL_STOP. Удаление службы выполняется функцией DeleteService.

Более простой (для тестирования) вариант - использовать штатную утилиту
Windows под названием sc.exe.

5) Отладка.

Есть разные варианты с подключением отладчика к службе. Например:

Launching the Debugger Automatically
http://msdn.microsoft.com/en-us/libr...8vs.71%29.aspx

Но лично я считаю, что самое удобное - выделить для отладки отдельную виртуальную
машину и мониторить отладочный вывод и управлять точками останова через отладчик
ядра (kernel debugger), например WinDbg. Еще лучше, если есть второй монитор,
тогда окно отладчика можно повесить на один монитор, а окно отлаживаемой виртуалки
на второй.
GBIT
 Аватар для GBIT
11 / 11 / 1
Регистрация: 05.10.2011
Сообщений: 219
07.05.2014, 11:34  [ТС]     Переделка программы в службу #6
DU, с дебагером дружу, дело в том, что это служба, и ее нужно установить, чтобы дебажить, из IDE этот дебаг становится сложнее. или для меня становится не возможным.
Сообщения (месаджбоксы) не выводятся, не знаю как по грамотному выразиться, но вы верно правильно поняли. не отрисовываются.
использую VS2010.
Убежденный, вроде разобрался, удалось запихать код в шаблон службы.
Однако появилась новая проблема, уже с правами доступа на копирование. Это выходит за рамки названия темы, по этому создал новую, в сетях. Прошу взглянуть:
Учетная запись NT Authority SYSTEM не хватает прав при копировании файла по сети
Yandex
Объявления
07.05.2014, 11:34     Переделка программы в службу
Ответ Создать тему
Опции темы

Текущее время: 14:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru