USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« : 22-03-2005 08:38 » |
|
Нигде не могу найти, как сделать чтобы сервис запускался вместе с системой(делал Start)?
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
Alf
Гость
|
|
« Ответ #1 : 22-03-2005 08:59 » |
|
Нужно установить в свойствах сервиса "Тип запуска" в значение "Авто"
|
|
|
Записан
|
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #2 : 22-03-2005 09:56 » |
|
Нужно установить в свойствах сервиса "Тип запуска" в значение "Авто"
А как это сделать программно? Вот допустим у меня есть сервис который написал я, мне нужно сделать инсталлятор который установит его так, чтобы сервис стартовал при запуске операционной системы, как это сделать?
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
Alf
Гость
|
|
« Ответ #3 : 22-03-2005 10:14 » |
|
Программно никогда их не запускал. Думаю, что корректнее предоставить выбор способа запуска администратору.
Если все же обязательно нужно запускать сервис автоматически после инсталляции, наверное, проще сделать это через реестр. Насколько я помню, для автозапуска значение параметра Start должно быть равно 2.
|
|
|
Записан
|
|
|
|
xelos
Гость
|
|
« Ответ #4 : 22-03-2005 10:50 » |
|
в windows общение с сервисами происходит через менеджер сервисов. он контролирует установленные сервисы и позволяет манипулировать с ними. после обеда код дам как с сервисами работать.
|
|
|
Записан
|
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #5 : 22-03-2005 10:54 » |
|
в windows общение с сервисами происходит через менеджер сервисов. он контролирует установленные сервисы и позволяет манипулировать с ними. после обеда код дам как с сервисами работать.
Буду очень сильно ждать Надо сделать инсталляшку уже вчера(((
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
Daniloff
Помогающий
Offline
|
|
« Ответ #6 : 22-03-2005 11:26 » |
|
SC_HANDLE scm,svc2;
scm=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE); if (!scm) { cout<<"Can't open SCM\n"; exit(1); } if(!(svc2=CreateService(scm,"dio","direct i/o access driver",SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER,SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,pname,NULL,NULL,NULL,NULL,NULL))){ DWORD err=GetLastError(); if(err!=ERROR_SERVICE_EXISTS){ puts("Giveio registration error!"); CloseServiceHandle(scm); exit(2); } }
Где SERVICE_AUTO_START - это как раз и есть директива автоматического старта
|
|
« Последнее редактирование: 20-12-2007 19:39 от Алексей1153++ »
|
Записан
|
|
|
|
xelos
Гость
|
|
« Ответ #7 : 22-03-2005 11:54 » |
|
для получения списка сервисов: SC_HANDLE schSCManager; CString m_stHost; m_edHost.GetWindowText(m_stHost); if (m_stHost.GetLength()<=0) { m_stHost="."; };
schSCManager=OpenSCManager(m_stHost,NULL,SC_MANAGER_ENUMERATE_SERVICE); if (schSCManager==NULL){ MessageBox("Can't open Service Manager"); } DWORD m_dwServiceType; m_dwServiceType=SERVICE_WIN32|SERVICE_DRIVER; if (m_cbWin32.GetCheck()==true) m_dwServiceType=SERVICE_WIN32; if (m_cbKernel.GetCheck()==true) m_dwServiceType=SERVICE_DRIVER; if ((m_cbWin32.GetCheck()==true)&&(m_cbKernel.GetCheck()==true)) m_dwServiceType=SERVICE_WIN32|SERVICE_DRIVER;
ENUM_SERVICE_STATUS service; DWORD dwBytesNeeded = 0; DWORD dwServicesReturned = 0; DWORD dwResumedHandle = 0; // Query services BOOL retVal = EnumServicesStatus(schSCManager, m_dwServiceType, SERVICE_STATE_ALL, &service, sizeof(ENUM_SERVICE_STATUS), &dwBytesNeeded, &dwServicesReturned, &dwResumedHandle);
для запуска существующего сервиса: SERVICE_STATUS ssStatus; DWORD dwOldCheckPoint; DWORD dwStartTickCount; DWORD dwWaitTime; DWORD dwStatus; SC_HANDLE schService;
POSITION m_position = m_lcServicesList.GetFirstSelectedItemPosition(); int m_iIndex; CString strn; m_iIndex = m_lcServicesList.GetNextSelectedItem(m_position); strn=pServices[m_iIndex].lpServiceName; schService = OpenService( schSCManager, // SCM database strn, // service name SERVICE_ALL_ACCESS); if (schService == NULL) { MessageBox("Can't open Service"); return; } if (!StartService( schService, // handle to service 0, // number of arguments NULL) ) // no arguments { MessageBox("Can't open Service"); return; } else { m_stServiceName.SetWindowText(_T("Service start pending.")); } // Check the status until the service is no longer start pending. if (!QueryServiceStatus( schService, // handle to service &ssStatus) ) // address of status information structure { //MyErrorExit("QueryServiceStatus"); } // Save the tick count and initial checkpoint.
dwStartTickCount = GetTickCount(); dwOldCheckPoint = ssStatus.dwCheckPoint;
while (ssStatus.dwCurrentState == SERVICE_START_PENDING) { // Do not wait longer than the wait hint. A good interval is // one tenth the wait hint, but no less than 1 second and no // more than 10 seconds. dwWaitTime = ssStatus.dwWaitHint / 10;
if( dwWaitTime < 1000 ) dwWaitTime = 1000; else if ( dwWaitTime > 10000 ) dwWaitTime = 10000;
Sleep( dwWaitTime );
// Check the status again. if (!QueryServiceStatus( schService, // handle to service &ssStatus) ) // address of structure break; if ( ssStatus.dwCheckPoint > dwOldCheckPoint ) { // The service is making progress.
dwStartTickCount = GetTickCount(); dwOldCheckPoint = ssStatus.dwCheckPoint; } else { if(GetTickCount()-dwStartTickCount > ssStatus.dwWaitHint) { // No progress made within the wait hint break; } } }
if (ssStatus.dwCurrentState == SERVICE_RUNNING) { m_stServiceName.SetWindowText(_T(strn)); FillListCtrl(); m_lcServicesList.SetItemState(m_iIndex, LVIS_SELECTED, LVIS_SELECTED | LVIS_FOCUSED); if ((pServices[m_iIndex].ServiceStatus.dwControlsAccepted==SERVICE_ACCEPT_PAUSE_CONTINUE)) { m_btPause.EnableWindow(true); m_btContinue.EnableWindow(true); } else { m_btPause.EnableWindow(false); m_btContinue.EnableWindow(false); }; if (pServices[m_iIndex].ServiceStatus.dwControlsAccepted==SERVICE_ACCEPT_STOP) m_btStop.EnableWindow(true); else m_btStop.EnableWindow(false);
if (pServices[m_iIndex].ServiceStatus.dwCurrentState==SERVICE_STOPPED) m_btStart.EnableWindow(true); else m_btStart.EnableWindow(false); } else { MessageBox("Service not started"); } CloseServiceHandle(schService); }
в проге используются контролы - типа список сервисов, кнопки, так что часть кода для управления этими контролами. и вообще, держи полную прогу - дает список сервисов на компе с задаваемым IP, позволяет определять операции которые можно делать с сервисами и делает эти операции.
|
|
« Последнее редактирование: 20-12-2007 19:42 от Алексей1153++ »
|
Записан
|
|
|
|
xelos
Гость
|
|
« Ответ #8 : 22-03-2005 11:55 » |
|
как создавать регистрировать сервис, Daniloff ответил... надеюсь все понятно?
|
|
|
Записан
|
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #9 : 23-03-2005 03:10 » |
|
как создавать регистрировать сервис, Daniloff ответил... надеюсь все понятно?
Вроде да... Только он ни в какую не хочет стартовать... Сервис брал рабочий отсюда http://www.rsdn.ru/article/files/Classes/svcclass.xmlНичего не менял внем, просто откомпилировал... Устанавливается нормально а запускаться не хочет нивкакую((((
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
sss
Специалист
Offline
|
|
« Ответ #10 : 23-03-2005 06:24 » |
|
Что возвращает GetLastError(...) после StartService(...) ? Может это и есть ответ...
|
|
|
Записан
|
while (8==8)
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #11 : 23-03-2005 06:56 » |
|
При открытии schService = OpenService( schSCManager, // SCM database strn, // service name SERVICE_ALL_ACCESS); получаю - 997 Overlapped I/O operation is in progress. ERROR_IO_PENDING Что это может быть?
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #12 : 23-03-2005 06:59 » |
|
При открытии schService = OpenService( schSCManager, // SCM database strn, // service name SERVICE_ALL_ACCESS); получаю - 997 Overlapped I/O operation is in progress. ERROR_IO_PENDING Что это может быть?
Как я понял это признак того, что операция началась и продолжается т е все нормально? StartService возвращает тоже самое Потом наступает таймоут а сервис так и не запускается...
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
sss
Специалист
Offline
|
|
« Ответ #13 : 23-03-2005 07:36 » |
|
Какой статус у службы на момент вызова OpenService() ? Посмотри в mmc.. И зависимости посмотри тоже...
|
|
|
Записан
|
while (8==8)
|
|
|
sss
Специалист
Offline
|
|
« Ответ #14 : 23-03-2005 07:40 » |
|
Еще в OpenSCManager(...) параметр lpDatabaseName чему равен ? NULL, NULL* или SERVICES_ACTIVE_DATABASE?
|
|
|
Записан
|
while (8==8)
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #15 : 23-03-2005 07:41 » |
|
Какой статус у службы на момент вызова OpenService() ? Посмотри в mmc.. И зависимости посмотри тоже...
До вызова - Остановлена зависимостей нет
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #16 : 23-03-2005 07:44 » |
|
m_hScm = OpenSCManager(NULL,NULL,dwAccess);
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
sss
Специалист
Offline
|
|
« Ответ #17 : 23-03-2005 07:47 » |
|
При открытии schService = OpenService( schSCManager, // SCM database strn, // service name SERVICE_ALL_ACCESS); получаю - 997 Overlapped I/O operation is in progress. ERROR_IO_PENDING Что это может быть?
schSCManager ! Это из одного кода?
|
|
|
Записан
|
while (8==8)
|
|
|
sss
Специалист
Offline
|
|
« Ответ #18 : 23-03-2005 07:50 » |
|
Я в смысле не перепутал m_hScm и schSCManager ?
|
|
|
Записан
|
while (8==8)
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #19 : 23-03-2005 07:50 » |
|
Блин закоментировал месайджбоксы вроде бы заработало
void CMWContext::OnServiceStart() { //MessageBox(NULL,L"Start",L"Simple service",0/*MB_SERVICE_NOTIFICATION*/); }
void CMWContext::OnServiceStop() { //MessageBox(NULL,L"Stop",L"Simple service",0/*MB_SERVICE_NOTIFICATION*/); }
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #20 : 23-03-2005 07:51 » |
|
Я в смысле не перепутал m_hScm и schSCManager ?
Нет не перепутал это из разных кодов
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
sss
Специалист
Offline
|
|
« Ответ #21 : 23-03-2005 07:52 » |
|
Всё таки помог GetLastError()...
|
|
|
Записан
|
while (8==8)
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #22 : 23-03-2005 07:54 » |
|
Блин глючный код какойто нет не у кого нормального исходника сервиса для XP?
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #23 : 23-03-2005 07:55 » |
|
После инсталяции и запуска при первом останове вылетает с ошибкой, потом работает нормально((((
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
sss
Специалист
Offline
|
|
« Ответ #24 : 23-03-2005 08:02 » |
|
Я думаю лучше используй какой есть, или начинай свой с нуля. У меня вот есть сервисы, но в них столько всего. А начинал их на основе компонента TService (CBuilder).
|
|
|
Записан
|
while (8==8)
|
|
|
|