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;
}
}
| |
|
|