win API функции нашел, но что-то не смог разобраться с тем, как получить этот список


Модератор: Модераторы
const
BuffSize = SizeOf(ENUM_SERVICE_STATUS)*4096;
var
Status: PENUMSERVICESTATUS;
Man: SC_HANDLE;
j: integer;
N: DWord = 0;
R: DWord = 0;
H: DWord = 0;
begin
Man:=OpenSCManager(nil,nil,SC_MANAGER_ENUMERATE_SERVICE);
if Man<>0 then
begin
Status:=GetMem(BuffSize);
if EnumServicesStatus(Man,SERVICE_WIN32,SERVICE_ACTIVE,Status,BuffSize,
@N,@R,@H) then
begin
for j:=0 to R-1 do
ListBox1.Items.Add(Status[j].lpServiceName);
end;
Freemem(Status);
CloseServiceHandle(Man);
end;
end;
function ServiceStart(const ServiceName: String): Boolean;
var
h_manager,h_svc: SC_Handle;
svc_status: TServiceStatus;
Temp: PChar;
dwCheckPoint: DWord;
i: Integer;
begin
svc_status.dwCurrentState := 1;
h_manager := OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
if h_manager > 0 then
begin
h_svc := OpenService(h_manager, PChar(ServiceName),
SERVICE_START or SERVICE_QUERY_STATUS);
if h_svc > 0 then
begin
temp := nil;
i:=0;
if (StartService(h_svc,0,temp)) then
if (QueryServiceStatus(h_svc,svc_status)) then
begin
while (SERVICE_RUNNING <> svc_status.dwCurrentState) and (i<1000) do
begin
i+=1;
dwCheckPoint := svc_status.dwCheckPoint;
Sleep(svc_status.dwWaitHint);
if (not QueryServiceStatus(h_svc,svc_status)) then
break;
if (svc_status.dwCheckPoint < dwCheckPoint) then
begin
// QueryServiceStatus не увеличивает dwCheckPoint
break;
end;
end;
end;
CloseServiceHandle(h_svc);
end;
CloseServiceHandle(h_manager);
end;
Result := SERVICE_RUNNING = svc_status.dwCurrentState;
end;
function ServiceStop(const ServiceName: String): Boolean;
var
h_manager, h_svc: SC_Handle;
svc_status: TServiceStatus;
dwCheckPoint: DWord;
i: Integer;
begin
h_manager:=OpenSCManager(nil,nil, SC_MANAGER_CONNECT);
if h_manager > 0 then
begin
h_svc := OpenService(h_manager,PChar(ServiceName),
SERVICE_STOP or SERVICE_QUERY_STATUS);
if h_svc > 0 then
begin
if(ControlService(h_svc,SERVICE_CONTROL_STOP, svc_status))then
begin
if(QueryServiceStatus(h_svc,svc_status))then
begin
i:=0;
while(SERVICE_STOPPED <> svc_status.dwCurrentState) and (i<1000) do
begin
i+=1;
dwCheckPoint := svc_status.dwCheckPoint;
Sleep(svc_status.dwWaitHint);
if(not QueryServiceStatus(h_svc,svc_status))then
begin
// couldn't check status
break;
end;
if(svc_status.dwCheckPoint < dwCheckPoint)then
break;
end;
end;
end;
CloseServiceHandle(h_svc);
end;
CloseServiceHandle(h_manager);
end;
Result := SERVICE_STOPPED = svc_status.dwCurrentState;
end;
i+=1;
unit my_system;
Interface
Uses Windows,My_Str,SysUtils,jwaWinNT,jwaWinSvc;
Const
SC_Stopped = 1; { статусы сервисов }
SC_Start_Pending = 2;
SC_Stop_Pending = 3;
SC_Running = 4;
SC_Paused = 7;
SC_Stopped_Str = 'остановлен';
SC_Start_Pending_Str = 'останвливается';
SC_Stop_Pending_Str = 'запускается';
SC_Running_Str = 'работает';
SC_Paused_Str = 'приостановлен';
procedure ExecuteControlService(ServiceName: AnsiString; ServiceControlCode : DWORD);
function ServiceStop(aMachine,aServiceName : AnsiString ) : boolean;
function ServiceStart(aMachine, aServiceName : AnsiString ) : boolean;
function ServiceGetStatus(sMachine, sService: AnsiString ): DWord;
function ServiceSetMode(sMachine, sService: AnsiString; Mode : Word ): Boolean;
Function ServiceStateStr(State : word) : string;
Implementation
procedure ExecuteControlService(ServiceName: AnsiString; ServiceControlCode : DWORD);
var
SCManagerHandle, SCHandle : THandle;
ServiceStatus : TServiceStatus;
begin
// 1. подключение к менеджеру сервисов
SCManagerHandle := OpenSCManager(nil, nil, GENERIC_READ);
SCHandle := OpenService(SCManagerHandle, PChar(ServiceName), SERVICE_ALL_ACCESS);
ControlService(SCHandle, ServiceControlCode, ServiceStatus);
CloseServiceHandle(SCHandle);
CloseServiceHandle(SCManagerHandle);
end;
function ServiceStop(aMachine,aServiceName : AnsiString ) : boolean;
// aMachine это UNC путь, либо локальный компьютер если пусто
var
h_manager,h_svc : SC_Handle;
svc_status : TServiceStatus;
dwCheckPoint : DWord;
begin
h_manager:=OpenSCManager(PChar(aMachine),nil,
SC_MANAGER_CONNECT);
if h_manager > 0 then
begin
h_svc := OpenService(h_manager,PChar(aServiceName),
SERVICE_STOP or SERVICE_QUERY_STATUS);
if h_svc > 0 then
begin
if(ControlService(h_svc,SERVICE_CONTROL_STOP,
svc_status))then
begin
if(QueryServiceStatus(h_svc,svc_status))then
begin
while(SERVICE_STOPPED <> svc_status.dwCurrentState)do
begin
dwCheckPoint := svc_status.dwCheckPoint;
Sleep(svc_status.dwWaitHint);
if(not QueryServiceStatus(h_svc,svc_status))then
begin
// couldn't check status
break;
end;
if(svc_status.dwCheckPoint < dwCheckPoint)then
break;
end;
end;
end;
CloseServiceHandle(h_svc);
end;
CloseServiceHandle(h_manager);
end;
ServiceStop := SERVICE_STOPPED = svc_status.dwCurrentState;
end;
function ServiceStart(aMachine, aServiceName : AnsiString ) : boolean;
// aMachine это UNC путь, либо локальный компьютер если пусто
var
h_manager,h_svc: SC_Handle;
svc_status: TServiceStatus;
Temp: PChar;
dwCheckPoint: DWord;
begin
svc_status.dwCurrentState := 1;
h_manager := OpenSCManager(PChar(aMachine), Nil,
SC_MANAGER_CONNECT);
if h_manager > 0 then
begin
h_svc := OpenService(h_manager, PChar(aServiceName),
SERVICE_START or SERVICE_QUERY_STATUS);
if h_svc > 0 then
begin
temp := nil;
if (StartService(h_svc,0,temp)) then
if (QueryServiceStatus(h_svc,svc_status)) then
begin
while (SERVICE_RUNNING <> svc_status.dwCurrentState) do
begin
dwCheckPoint := svc_status.dwCheckPoint;
Sleep(svc_status.dwWaitHint);
if (not QueryServiceStatus(h_svc,svc_status)) then
break;
if (svc_status.dwCheckPoint < dwCheckPoint) then
begin
// QueryServiceStatus не увеличивает dwCheckPoint
break;
end;
end;
end;
CloseServiceHandle(h_svc);
end;
CloseServiceHandle(h_manager);
end;
ServiceStart := SERVICE_RUNNING = svc_status.dwCurrentState;
end;
function ServiceGetStatus(sMachine, sService: AnsiString ): DWord;
var
h_manager,h_service,h_svc: SC_Handle;
service_status : TServiceStatus;
hStat : DWord;
begin
hStat := 1;
h_manager := OpenSCManager(PChar(sMachine) ,Nil,
SC_MANAGER_CONNECT);
if h_manager > 0 then
begin
h_svc := OpenService(h_manager,PChar(sService),
SERVICE_QUERY_STATUS);
if h_svc > 0 then
begin
if(QueryServiceStatus(h_svc, service_status)) then
hStat := service_status.dwCurrentState;
CloseServiceHandle(h_svc);
end;
CloseServiceHandle(h_manager);
end;
ServiceGetStatus := hStat;
end;
function ServiceSetMode(sMachine, sService: AnsiString; Mode : Word ): Boolean;
// Тип запуска сервиса: SERVICE_DEMAND_START
// SERVICE_AUTO_START
var
h_manager,h_service,h_svc: SC_Handle;
service_status : TServiceStatus;
// hStat : DWord;
SvcLock : SC_Lock;
begin
// hStat := 1;
ServiceSetMode := False;
h_manager := OpenSCManager(PChar(sMachine) ,Nil,
SC_MANAGER_All_Access);
if h_manager > 0 then
begin
// Блокируем базу сервисов.
SvcLock := LockServiceDatabase(h_manager);
if SvcLock = Nil then
exit; // Ошибка блокирования сервисов
h_svc := OpenService(h_manager,PChar(sService),
SERVICE_All_Access);
// Проверим, что удалось обратиться к сервису.
if h_svc > 0 Then
begin
if not ChangeServiceConfig(h_svc,SERVICE_NO_CHANGE,
Mode, // Тип запуска сервиса: SERVICE_DEMAND_START
// SERVICE_AUTO_START
SERVICE_NO_CHANGE,Nil,Nil,Nil,Nil,Nil,Nil,Nil)
Then
// Ошибка смены статуса сервиса.
exit;
end;
UnlockServiceDatabase(SvcLock);
CloseServiceHandle(h_svc);
CloseServiceHandle(h_manager);
end
else
exit; //Выход по ошибке обращения к сервисам.
ServiceSetMode := True;
end;
Function ServiceStateStr(State : word) : string;
begin
case State of
SC_Stopped : ServiceStateStr := 'Stopped'; { статусы сервисов }
SC_Start_Pending : ServiceStateStr := 'Start Pending';
SC_Stop_Pending : ServiceStateStr := 'Stop Pending';
SC_Running : ServiceStateStr := 'Running';
SC_Paused : ServiceStateStr := 'Paused';
1722 : ServiceStateStr := 'The RPC server is unavailable';
else
ServiceStateStr := 'Статус: ' + IntToStr(State)
end { case }
end;
Begin
End.
PapaNT писал(а):а что такое?
- Код: Выделить всё
i+=1;
i+=1;
i++;
i:=i+1;
inc(i);
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3