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

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

ru
Offline 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
Опытный

ru
Offline 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
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #5 : 22-03-2005 10:54 » 

в windows общение с сервисами происходит через менеджер сервисов. он контролирует установленные сервисы и позволяет манипулировать с ними. после обеда код дам как с сервисами работать.

Буду очень сильно ждать Надо сделать инсталляшку уже вчера(((
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Daniloff
Помогающий

ru
Offline 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, позволяет определять операции которые можно делать с сервисами и делает эти операции.

* ServiceMFC.zip (52.52 Кб - загружено 831 раз.)
« Последнее редактирование: 20-12-2007 19:42 от Алексей1153++ » Записан
xelos
Гость
« Ответ #8 : 22-03-2005 11:55 » 

как создавать регистрировать сервис, Daniloff ответил... надеюсь все понятно?
Записан
USBLexus
Опытный

ru
Offline 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
Специалист

ru
Offline Offline

« Ответ #10 : 23-03-2005 06:24 » 

Что возвращает GetLastError(...) после StartService(...) ? Может это и есть ответ...
Записан

while (8==8)
USBLexus
Опытный

ru
Offline 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
Опытный

ru
Offline 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
Специалист

ru
Offline Offline

« Ответ #13 : 23-03-2005 07:36 » 

Какой статус у службы на момент вызова OpenService() ? Посмотри в mmc..
И зависимости посмотри тоже...
Записан

while (8==8)
sss
Специалист

ru
Offline Offline

« Ответ #14 : 23-03-2005 07:40 » 

Еще в OpenSCManager(...) параметр lpDatabaseName чему равен ? NULL, NULL* или SERVICES_ACTIVE_DATABASE?
Записан

while (8==8)
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #15 : 23-03-2005 07:41 » 

Какой статус у службы на момент вызова OpenService() ? Посмотри в mmc..
И зависимости посмотри тоже...
До вызова - Остановлена зависимостей нет
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #16 : 23-03-2005 07:44 » 

m_hScm = OpenSCManager(NULL,NULL,dwAccess);
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
sss
Специалист

ru
Offline 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
Специалист

ru
Offline Offline

« Ответ #18 : 23-03-2005 07:50 » 

Я в смысле не перепутал m_hScm и schSCManager ?
Записан

while (8==8)
USBLexus
Опытный

ru
Offline 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
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #20 : 23-03-2005 07:51 » 

Я в смысле не перепутал m_hScm и schSCManager ?
Нет не перепутал это из разных кодов
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
sss
Специалист

ru
Offline Offline

« Ответ #21 : 23-03-2005 07:52 » 

Всё таки помог GetLastError()...
Записан

while (8==8)
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #22 : 23-03-2005 07:54 » 

Блин глючный код какойто нет не у кого нормального исходника сервиса для XP?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #23 : 23-03-2005 07:55 » 

После инсталяции и запуска при первом останове вылетает с ошибкой, потом работает нормально((((
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
sss
Специалист

ru
Offline Offline

« Ответ #24 : 23-03-2005 08:02 » new

Я думаю лучше используй какой есть, или начинай свой с нуля. У меня вот есть сервисы, но в них столько всего. А начинал их на основе компонента TService (CBuilder).
Записан

while (8==8)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines