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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как сделать запуск сервиса при загрузке Windows?  (Прочитано 24922 раз)
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 » new

Программно никогда их не запускал. Думаю, что корректнее предоставить выбор способа запуска администратору.

Если все же обязательно нужно запускать сервис автоматически после инсталляции, наверное, проще сделать это через реестр. Насколько я помню, для автозапуска значение параметра 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 Кб - загружено 803 раз.)
« Последнее редактирование: 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 » 

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

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines