![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как определить что сервис зарегестрирован ? [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