Падает комп с 16-го этажа и думает: "Вот бы сейчас зависнуть".
uses
WinSvc;
function ServiceGetStatus(sMachine, sService: PChar): DWORD;
{******************************************}{*** Parameters: ***}{*** sService: specifies the name of the service to open
{*** sMachine: specifies the name of the target computer
{*** ***}{*** Return Values: ***}{*** -1 = Error opening service ***}{*** 1 = SERVICE_STOPPED ***}{*** 2 = SERVICE_START_PENDING ***}{*** 3 = SERVICE_STOP_PENDING ***}{*** 4 = SERVICE_RUNNING ***}{*** 5 = SERVICE_CONTINUE_PENDING ***}{*** 6 = SERVICE_PAUSE_PENDING ***}{*** 7 = SERVICE_PAUSED ***}{******************************************}var
SCManHandle, SvcHandle: SC_Handle;
SS: TServiceStatus;
dwStat: DWORD;
begin
dwStat := 0;
// Open service manager handle.
SCManHandle := OpenSCManager(sMachine, nil, SC_MANAGER_CONNECT);
if (SCManHandle > 0) thenbegin
SvcHandle := OpenService(SCManHandle, sService, SERVICE_QUERY_STATUS);
// if Service installed if (SvcHandle > 0) thenbegin// SS structure holds the service status (TServiceStatus); if (QueryServiceStatus(SvcHandle, SS)) then
dwStat := ss.dwCurrentState;
CloseServiceHandle(SvcHandle);
end;
CloseServiceHandle(SCManHandle);
end;
Result := dwStat;
end;
function ServiceRunning(sMachine, sService: PChar): Boolean;
begin
Result := SERVICE_RUNNING = ServiceGetStatus(sMachine, sService);
end;
// Check if Eventlog Service is running procedure TForm1.Button1Click(Sender: TObject);
beginif ServiceRunning(nil, 'Eventlog') then
ShowMessage('Eventlog Service Running')
else
ShowMessage('Eventlog Service not Running')
end;
{
Windows 2000 and earlier: All processes are granted the SC_MANAGER_CONNECT,
SC_MANAGER_ENUMERATE_SERVICE, and SC_MANAGER_QUERY_LOCK_STATUS access rights.
Windows XP: Only authenticated users are granted the SC_MANAGER_CONNECT,
SC_MANAGER_ENUMERATE_SERVICE,
and SC_MANAGER_QUERY_LOCK_STATUS access rights.
}{
Do not use the service display name (as displayed in the services
control panel applet.) You must use the real service name, as
referenced in the registry under
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services
}
Программа на Delphi, которая проверяет запущен ли Windows-сервис. Специфический сервис, который проверяется, - это Служба журнала событий.
Код выполняет следующие действия:
Определяет две функции: ServiceGetStatus и ServiceRunning.
ServiceGetStatus: Функция принимает два параметра, sMachine и sService, которые указывают на имя целевого компьютера и имя сервиса для открытия соответственно. Функция возвращает DWORD-значение, указывающее статус сервиса:
1 = SERVICE_STOPPED
2 = SERVICE_START_PENDING
3 = SERVICE_STOP_PENDING
4 = SERVICE_RUNNING
5 = SERVICE_CONTINUE_PENDING
6 = SERVICE_PAUSE_PENDING
7 = SERVICE_PAUSED
ServiceRunning: Функция является обёрткой вокруг ServiceGetStatus и просто возвращает, соответствует ли статус сервиса SERVICE_RUNNING.
Определяет процедуру Button1Click, которая вызывается при клике кнопки на форме (TForm1).
Процедура проверяет, запущен ли Служба журнала событий, используя ServiceRunning. Если она запущена, отображается сообщение об ошибке, говорящее о том, что "Служба журнала событий запущена". В противном случае отображается сообщение об ошибке, говорящее о том, что "Служба журнала событий не запущена".
Код также включает в себя примечания о разрешениях Windows-сервисов и важности использования реального имени сервиса вместо имени отображения.
Для улучшения кода:
Обработка ошибок: Текущая реализация не обрабатывает ошибки хорошо. Например, если OpenSCManager или OpenService fails, она вернет код ошибки, но программа продолжит выполняться без какого-либо указания о том, что что-то пошло не так. Лучше было бы проверять ошибки и отображать значимое сообщение пользователю.
Организация кода: Процедура Button1Click тесно связана с функциями управления сервисами. Для улучшения поддерживаемости считайте, что эти функции переместите в свой собственный модуль или единицу и сделайте их более универсальными.
Комментарии к коду: Хотя есть комментарии в коде, они могли бы быть более подробными и информативными. Рассмотрите добавление комментариев, объясняющих почему были сделаны определенные решения, что конкретные части кода делают и как они взаимодействуют друг с другом.
Обработка имени сервиса: Код предполагает, что имя сервиса всегда равно 'Eventlog'. Для того, чтобы сделать его более общепринятым, рассмотрите передачу имени сервиса в параметр или хранение его в файле конфигурации.
Улучшения интерфейса: Программа отображает сообщения об ошибке для указания о том, запущен ли сервис или нет. Рассмотрите добавление более дружественных элементов интерфейса, таких как полоса состояния или список, чтобы отображать эту информацию в более структурированном виде.
Функция ServiceGetStatus позволяет получить статус запущенного сервиса на компьютере, а функция ServiceRunning проверяет, запущен ли конкретный сервис.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.