Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как определить что сервис зарегестрирован ? [D6, Win2k]


dream ©   (2004-08-11 08:08:00) 

Есть сервис на delphi, как определить что он зарегестрирован в списке сервисов ?


dream   (2004-08-11 09:58:00) [1]

> Digitman ©   (11.08.04 09:24) [5]

Если это обычная функция то пожайлуста напиши её если не трудно. я в этом новичёк и разбираться времени нету проект встал :(
В долгу не останусь


Digitman   (2004-08-11 09:24:00) [2]

EnumServicesStatus - это ф-ция, и она возвращает строго определенный результат, показывающий успешность или неуспешность ее выполнения .. почему ты его не анализируешь ?


> lpServices[0], // !! В описании функции ошибка - эдесь должен
> быть указатель на массив элементов


глупости.

LPENUM_SERVICE_STATUS lpServices, // pointer to service status buffer

массив или не массив ты подставляешь - это твои проблемы, а для Win32 это должен быть просто указатель на некий буфер


> не хочет работать глючит


что говорит-то хоть ?


dream   (2004-08-11 09:09:00) [3]

Не могу найти как определить ? блин код запутынный.

Нашёл :

function TForm1.CreateServiceList: boolean;
var
SCManagerHandle : THandle;
lpServices : array of TEnumServiceStatus;
pcbBytesNeeded, lpServicesReturned, lpResumeHandle: DWORD;
ServiceMode, ServiceStatus : integer;
i : integer;
S : string;
LI : TListItem;
begin
// Очистка списка
ListView1.Items.Clear;
// 1. Подключениемся к менеджеру сервисов
SCManagerHandle := OpenSCManager(nil, nil, GENERIC_READ);
case rgServiceMode.ItemIndex of
 0 : ServiceMode := SERVICE_WIN32;
 1 : ServiceMode := SERVICE_DRIVER;
 2 : ServiceMode := SERVICE_WIN32 or SERVICE_DRIVER;
end;
case rgServiceStatus.ItemIndex of
 0 : ServiceStatus := SERVICE_ACTIVE;
 1 : ServiceStatus := SERVICE_INACTIVE;
 2 : ServiceStatus := SERVICE_ACTIVE or SERVICE_INACTIVE;
end;
// ResumeHandle := 0 !! Это важно, т.к. это задает пречисление
// сервисов с начала
lpResumeHandle := 0;
// 2. Перечисление сервисов (размер буфера = 0 - мы определяем, какой реально
// размер необходим для списка сервисов
EnumServicesStatus(SCManagerHandle,
                   ServiceMode,
                   ServiceStatus,
                   lpServices[0], // !! В описании функции ошибка - эдесь должен быть указатель на массив элементов
                   0,
                   pcbBytesNeeded,
                   lpServicesReturned,
                   lpResumeHandle);
// 3. Настройка размера массива
SetLength(lpServices, pcbBytesNeeded div SizeOf(TEnumServiceStatus));
// 4. Повторный запрос списка сервисов (размер массива соответствует определенному на шаге 2)
lpResumeHandle := 0;
EnumServicesStatus(SCManagerHandle,
                   ServiceMode,
                   ServiceStatus,
                   lpServices[0],
                   Length(lpServices) * SizeOf(TEnumServiceStatus),
                   pcbBytesNeeded,
                   lpServicesReturned,
                   lpResumeHandle);
// Вывод полученных данных в ListView1
for i := 0 to lpServicesReturned - 1 do begin
 LI := ListView1.Items.Add;
 LI.Caption := lpServices[i].lpServiceName;
 LI.SubItems.Add(lpServices[i].lpDisplayName);
 S := '??';
 // Расшифровка кода состояния
 case lpServices[i].ServiceStatus.dwCurrentState of
  SERVICE_STOPPED          : S := 'Сервис не запущен';
  SERVICE_START_PENDING    : S := 'Сервис в процессе запуска';
  SERVICE_STOP_PENDING     : S := 'Сервис в процессе завершения';
  SERVICE_RUNNING          : S := 'Сервис запущен';
  SERVICE_CONTINUE_PENDING : S := 'Сервис в процессе запуска после временной оснановки';
  SERVICE_PAUSE_PENDING    : S := 'Сервис в процессе временной оснановки';
  SERVICE_PAUSED           : S := 'Сервис временно оснановлен';
 end;
 LI.SubItems.Add(S);
end;
// 5. Закрытие менеджера
CloseServiceHandle(SCManagerHandle);
end;

Но не хочет работать глючит , что то подключать нужно блин


Digitman   (2004-08-11 09:07:00) [4]


> Можно по подробнее ?


поподробнее о ЧЕМ ?


dream   (2004-08-11 09:06:00) [5]

> Digitman ©   (11.08.04 08:47) [1]

Можно по подробнее ?


Digitman   (2004-08-11 08:47:00) [6]

см. OpenSCManager + EnumServicesStatus


Наверх

Титульная страница Поиск, карта сайта Написать письмо