C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Сервисы, Запуск\останов сервисов
Stimo
Отправлено: 23.04.2005, 14:31


Ученик-кочегар

Группа: Участник
Сообщений: 12



Как проверить, запущен тот или иной сервис, и если не запущен, запустить?
Есть метод запуска — WinExec("net start <имя_сервиса>"), но, по-моему, это грубова-то..
xim
Отправлено: 24.04.2005, 13:45


Станционный диспетчер

Группа: Участник
Сообщений: 143



CODE

int StartService(char *srv_nm)
{
   SERVICE_STATUS   ssStatus;
   SC_HANDLE        schSCManager;
   SC_HANDLE        schService;
   DWORD            dwOldCheckPoint;
   DWORD            dwStartTickCount;
   DWORD            dwWaitTime;

   schSCManager=OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT);
   if(!OpenSCManager) {
     printf("Ошибка при открытии Service Manager");
     return 0;
   }

   schService=OpenService(schSCManager,srv_nm,SERVICE_ALL_ACCESS);
   if(!schService) {
     printf("Ошибка при доступе к сервису \"%s\"",srv_nm);
     CloseServiceHandle(schSCManager);
     return 0;
   }

   if(!StartService(schService,0,NULL)) { // no arguments
     printf("Ошибка при старте сервиса \"%s\"",srv_nm);
     CloseServiceHandle(schService);
     CloseServiceHandle(schSCManager);
     return 0;
   } else {
       printf("Запуск сервиса.\n");
   }

   if(!QueryServiceStatus(schService,&ssStatus)) {
     CloseServiceHandle(schService);
     CloseServiceHandle(schSCManager);
     return 0;
   }

   dwStartTickCount = GetTickCount();
   dwOldCheckPoint = ssStatus.dwCheckPoint;

   while (ssStatus.dwCurrentState == SERVICE_START_PENDING) {
       dwWaitTime = ssStatus.dwWaitHint/10;
       if( dwWaitTime < 1000 )
           dwWaitTime = 1000;
       else if ( dwWaitTime > 10000 )
           dwWaitTime = 10000;
       Sleep( dwWaitTime );

       if(!QueryServiceStatus(schService,&ssStatus))
           break;

       if(ssStatus.dwCheckPoint>dwOldCheckPoint)
       {
           dwStartTickCount = GetTickCount();
           dwOldCheckPoint = ssStatus.dwCheckPoint;
       } else {
           if(GetTickCount()-dwStartTickCount > ssStatus.dwWaitHint) {
               break;
           }
       }
   }

   CloseServiceHandle(schService);
   CloseServiceHandle(schSCManager);

   if (ssStatus.dwCurrentState == SERVICE_RUNNING) {
       printf("Сервис %s успешно запущен.\n", srv_nm);
       return 1;
   } else {
       printf("\nСервис не запущен. \n");
       printf("  Статус: %d\n", ssStatus.dwCurrentState);
       printf("  Код выхода: %d\n", ssStatus.dwWin32ExitCode);
       printf("  Ошибка при запуске: %d\n",
           ssStatus.dwServiceSpecificExitCode);
       printf("  Прогресс старта: %d\n", ssStatus.dwCheckPoint);
       printf("  Время до окончания: %d\n", ssStatus.dwWaitHint);
       return 0;
   }
}

Вернуться в Вопросы программирования в C++Builder