alex87
|
|
« : 15-04-2010 06:36 » |
|
Как сделать службу Windows? С чего начинать? Служба будет приклеплена к моей программе.
|
|
|
Записан
|
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #1 : 15-04-2010 07:43 » |
|
Если на Winapi, то почитайте про функции OpenSCManager(), LockServiceDatabase(), CreateService(), ChangeServiceConfig2(), UnlockServiceDatabase(), CloseServiceHandle(), SetServiceStatus(). Вполне возможно, что у Borland C++ Builder есть какие-то свои компоненты упрощающие создание и запуск сервисов.
|
|
« Последнее редактирование: 15-04-2010 07:45 от darkelf »
|
Записан
|
|
|
|
|
alex87
|
|
« Ответ #3 : 15-04-2010 08:49 » |
|
хм... но мне именно надо под C++Builder хотя винайпи функции и в билдере приемлемы...
|
|
|
Записан
|
|
|
|
alex87
|
|
« Ответ #4 : 16-04-2010 03:10 » |
|
есть у кого хотяб пример небольшой??
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #5 : 16-04-2010 03:12 » |
|
alex87, смотри ссылку выше - там есть примеры. Я только что посмотрел
|
|
|
Записан
|
|
|
|
alex87
|
|
« Ответ #6 : 16-04-2010 05:32 » |
|
Смотрел, не понял, что и как ... Запутался короче Понял что это консольное
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #7 : 16-04-2010 06:25 » |
|
где что консольное ? Ткни пальцем )) Я не увидел...
|
|
|
Записан
|
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #8 : 16-04-2010 08:35 » |
|
Понял что это консольное
Службы - программы в основном не интерактивные, поэтому для них вполне хватает консольных приложений.
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #9 : 16-04-2010 09:10 » |
|
Смотрел, не понял, что и как ... Запутался короче
Так потому и написал, что лучше Рихтера сначала почитать. Чтобы тут в топике главу про службы не пересказывать целиком. ЗЫ Консольная или ГУЁвая или вообще без интерфейса (явного), это относится у управляющей программе, а не к самой службе. Рихтер Рихтер Рихтер
|
|
« Последнее редактирование: 16-04-2010 09:12 от resource »
|
Записан
|
|
|
|
alex87
|
|
« Ответ #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
Молодой специалист
Offline
Пол:
|
|
« Ответ #11 : 20-04-2010 08:06 » |
|
Может я что то упустил?? Чтоб понять, упустил или нет, надо понимать, что изначально хотел. Ты вроде как хотел сделать службу. Ты ее сделал? Насколько сам осознаешь, что делает этот твой код?
|
|
|
Записан
|
|
|
|
alex87
|
|
« Ответ #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
Молодой специалист
Offline
Пол:
|
|
« Ответ #13 : 21-04-2010 10:11 » |
|
служба в свою очередь должна запускаться исполняя exe файл Где сама служба-то? Какую вообще службу запустить пытаешься?
|
|
|
Записан
|
|
|
|
alex87
|
|
« Ответ #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
|
|
« Ответ #15 : 29-04-2010 00:30 » |
|
все заработало...
|
|
|
Записан
|
|
|
|
|