Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Службы Windows  (Прочитано 20104 раз)
0 Пользователей и 1 Гость смотрят эту тему.
alex87
Постоялец

ru
Offline Offline
Пол: Мужской

« : 15-04-2010 06:36 » 

Как сделать службу Windows?
С чего начинать?
Служба будет приклеплена к моей программе.
Записан

Улыбаюсь Ага
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #1 : 15-04-2010 07:43 » 

Если на Winapi, то почитайте про функции OpenSCManager(), LockServiceDatabase(), CreateService(), ChangeServiceConfig2(), UnlockServiceDatabase(), CloseServiceHandle(), SetServiceStatus(). Вполне возможно, что у Borland C++ Builder есть какие-то свои компоненты упрощающие создание и запуск сервисов.
« Последнее редактирование: 15-04-2010 07:45 от darkelf » Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 15-04-2010 08:43 » 

http://msdn.microsoft.com/en-us/library/ms686953(VS.85).aspx

Там всё. Но лучше бы сначала Рихтера почитать.
Записан
alex87
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 15-04-2010 08:49 » 

хм... но мне именно надо под C++Builder
хотя винайпи функции и в билдере приемлемы...
Записан

Улыбаюсь Ага
alex87
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 16-04-2010 03:10 » 

есть у кого хотяб пример небольшой??
Записан

Улыбаюсь Ага
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 16-04-2010 03:12 » 

alex87, смотри ссылку выше - там есть примеры. Я только что посмотрел Улыбаюсь
Записан

alex87
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 16-04-2010 05:32 » 

Смотрел, не понял, что и как ... Запутался короче
Понял что это консольное
Записан

Улыбаюсь Ага
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 16-04-2010 06:25 » 

где что консольное ? Ткни пальцем )) Я не увидел...
Записан

darkelf
Молодой специалист

ua
Offline Offline

« Ответ #8 : 16-04-2010 08:35 » 

Понял что это консольное
Службы - программы в основном не интерактивные, поэтому для них вполне хватает консольных приложений.
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 16-04-2010 09:10 » 

Смотрел, не понял, что и как ... Запутался короче

Так потому и написал, что лучше Рихтера сначала почитать. Чтобы тут в топике главу про службы не пересказывать целиком.

ЗЫ Консольная или ГУЁвая или вообще без интерфейса (явного), это относится у управляющей программе, а не к самой службе. Рихтер Рихтер Рихтер  Улыбаюсь
« Последнее редактирование: 16-04-2010 09:12 от resource » Записан
alex87
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 20-04-2010 04:09 » 

Код:
  AnsiString path;
  AnsiString name;
  path = Edit1->Text;
  name = Edit2->Text;
  if (path == "" || name == "")
     ShowMessage("Заполните все поля");
  else
     {
        hManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); // создаём связь с БД SCM
        if (!(hManager))
           ShowMessage("Связь не установлена!");
        else
           {
                hService=CreateService(
                                hManager,
                                name.c_str(),
                                name.c_str(),
                                SERVICE_ALL_ACCESS,                         
                                SERVICE_WIN32_OWN_PROCESS,
                                SERVICE_AUTO_START,
                                SERVICE_ERROR_NORMAL,
                                path.c_str(),
                                NULL,
                                NULL,
                                NULL,
                                NULL,
                                NULL); // создаём службу
                if (!(hService))
                   ShowMessage("Сервис не был создан");
                else
                   {
                        StartService(hService,NULL,NULL); // запускаем созданную службу, тем самым запуская нашу прогу
//по идее должно работать, но увы не получается.
                   }
                CloseServiceHandle(hManager); // закрываем БД SCM.
           }
     }
Может я что то упустил??
Даже есть просто в службы зайти и запустить, выдает ошибку: "Ошибка 1053: Служба не ответила на запрос своевременно".
Записан

Улыбаюсь Ага
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 20-04-2010 08:06 » 

Цитата: alex87
Может я что то упустил??

Чтоб понять, упустил или нет, надо понимать, что изначально хотел. Ты вроде как хотел сделать службу. Ты ее сделал? Насколько сам осознаешь, что делает этот твой код?
Записан
alex87
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 21-04-2010 09:31 » 

Создать службу, а служба в свою очередь должна запускаться исполняя exe файл.
создаю, указываю имя, путь к exe файлу, тип загрузки и т.д.
Код:
hService=CreateService(
                                hManager, //хендл
                                name.c_str(), //имя службы
                                name.c_str(), //имя
                                SERVICE_ALL_ACCESS,                 //доступ                       
                                SERVICE_WIN32_OWN_PROCESS, //тип загрузки
                                SERVICE_AUTO_START, //метод загрузки
                                SERVICE_ERROR_NORMAL, //проверка ошибок
                                path.c_str(), // путь к exe
                                NULL,
                                NULL,
                                NULL,
                                NULL,
                                NULL);
и запускаю ее с помощью "StartService".
Записан

Улыбаюсь Ага
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 21-04-2010 10:11 » 

служба в свою очередь должна запускаться исполняя exe файл

 Не понял

Где сама служба-то? Какую вообще службу запустить пытаешься?
Записан
alex87
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 28-04-2010 01:30 » 

Попробывал другой вариант. В билдере есть ServiceApplication, который как раз и будет сервисом.
написал только старт и стоп
полностью cpp:
Код:
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TService_S1 *Service_S1;
//---------------------------------------------------------------------------
__fastcall TService_S1::TService_S1(TComponent* Owner)
: TService(Owner)
{

}

TServiceController __fastcall TService_S1::GetServiceController(void)
{
return (TServiceController) ServiceController;
}

void __stdcall ServiceController(unsigned CtrlCode)
{
Service_S1->Controller(CtrlCode);
}
//---------------------------------------------------------------------------
void __fastcall TService_S1::ServiceStart(TService *Sender, bool &Started)
{
  ShellExecute(NULL,"open","D:\\test.exe",NULL,NULL,SW_SHOWNORMAL);
  Started = true;
}
//---------------------------------------------------------------------------
void __fastcall TService_S1::ServiceStop(TService *Sender, bool &Stopped)
{
  HWND hWnd = FindWindow("TTest",NULL); // ищем свою программу
  if (hWnd!=NULL)
     {
        PostMessage(hWnd,WM_SYSCOMMAND,SC_CLOSE,0);
     }
  Stopped = true;
}
//---------------------------------------------------------------------------
После инсталяции "Service_S1.exe /install" и перезагрузки компьютера, загружается и работает, Но при нажатии стоп(останавливается) и затем старт выдает ошибку "Ошибка 1053: Служба не ответила на запрос своевременно".
Как от этого избавиться?
Записан

Улыбаюсь Ага
alex87
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 29-04-2010 00:30 » new

все заработало...
Записан

Улыбаюсь Ага
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines