Помогите пожалуйста вывести название службы и состояние в StringGrid , а не в Listbox
Не знаю, как это осуществить со StingGridom. Вывод должен быть по одной кнопке, чтобы в первой колонке Название службы, а во второй ее состояние (Запущена или Остановлена)
Вот код с ListBox:
Код:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Winsvc;
type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
Button2: TButton;
Button3: TButton;
Label1: TLabel;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure StartService(ServiceName: string);
procedure Button3Click(Sender: TObject);
procedure StopService(ServiceName: string);
procedure Button4Click(Sender: TObject);
procedure ServiceStatus(ServiceName: string);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// типы службы
const
SERVICE_KERNEL_DRIVER = $00000001;
SERVICE_FILE_SYSTEM_DRIVER = $00000002;
SERVICE_ADAPTER = $00000004;
SERVICE_RECOGNIZER_DRIVER = $00000008;
SERVICE_DRIVER =
(SERVICE_KERNEL_DRIVER or
SERVICE_FILE_SYSTEM_DRIVER or
SERVICE_RECOGNIZER_DRIVER);
SERVICE_WIN32_OWN_PROCESS = $00000010;
SERVICE_WIN32_SHARE_PROCESS = $00000020;
SERVICE_WIN32 =
(SERVICE_WIN32_OWN_PROCESS or
SERVICE_WIN32_SHARE_PROCESS);
SERVICE_INTERACTIVE_PROCESS = $00000100;
SERVICE_TYPE_ALL =
(SERVICE_WIN32 or
SERVICE_ADAPTER or
SERVICE_DRIVER or
SERVICE_INTERACTIVE_PROCESS);
function ServiceGetList(sMachine : string; dwServiceType, dwServiceState : DWord; slServicesList : TStrings ): boolean;
const
cnMaxServices = 4096;
type
TSvcA = array[0..cnMaxServices] of TEnumServiceStatus;
PSvcA = ^TSvcA;
var
j:integer; //временная переменная
schm:SC_Handle; //управление службами
nBytesNeeded, // для буфера
nServices, //кол-во служб
nResumeHandle:DWord; // указатель на следующую службу
ssa : PSvcA; // состояние службы
begin
Result := false;
// подключаемся к управлению службами
schm := OpenSCManager(PChar(sMachine),Nil, MAXIMUM_ALLOWED);
// если удачно
if(schm > 0)then
begin
nResumeHandle := 0;
New(ssa);
EnumServicesStatus(
schm,
dwServiceType,
dwServiceState,
ssa^[0],
SizeOf(ssa^),
nBytesNeeded,
nServices,
nResumeHandle );
//
// Предположим, что размер массива достаточен
for j := 0 to nServices-1 do
begin
slServicesList.Add( StrPas(ssa^[j].lpDisplayName ) );
end;
Result := true;
Dispose(ssa);
// закрыть дескриптор управления службами
CloseServiceHandle(schm);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ServiceGetList( '', SERVICE_WIN32,SERVICE_STATE_ALL, ListBox1.Items);
end;
procedure TForm1.Button2Click(Sender: TObject);
var i:Integer;
begin
for i:=listbox1.items.count -1 downto 0 do
if listbox1.selected[i] then
begin
inttostr(i);
StartService(Listbox1.Items[i])
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var i:Integer;
begin
for i:=listbox1.items.count -1 downto 0 do
if listbox1.selected[i] then
begin
inttostr(i);
StopService(Listbox1.Items[i])
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
var i:Integer;
begin
for i:=listbox1.items.count -1 downto 0 do
if listbox1.selected[i] then
begin
inttostr(i);
ServiceStatus(Listbox1.Items[i])
end;
end;
procedure TForm1.ServiceStatus(ServiceName: string);
var sStatus: SERVICE_STATUS;
schSCManager: SC_HANDLE;
schService: SC_HANDLE;
begin
schSCManager:=OpenSCManager(nil,nil,MAXIMUM_ALLOWED);
if schSCManager=0 then RaiseLastOSError;
schService:=OpenService(schSCManager,PChar(ServiceName),MAXIMUM_ALLOWED);
if schService=0 then RaiseLastOSError;
if(QueryServiceStatus(schService,sStatus)) then begin
case sStatus.dwCurrentState of
SERVICE_STOPPED: Label1.Caption := 'Состояние: Остановлена';
SERVICE_RUNNING: Label1.Caption := 'Состояние: Запущена';
end;
end;
end;
procedure TForm1.StartService(ServiceName: String);
var
schService,
schSCManager: Dword;
p: PChar;
begin
p := nil;
schSCManager := OpenSCManager(nil, nil, MAXIMUM_ALLOWED);
if schSCManager = 0 then
RaiseLastWin32Error;
try
schService := OpenService(schSCManager, PChar(ServiceName), SERVICE_ALL_ACCESS);
if schService = 0 then
RaiseLastWin32Error;
try
if not Winsvc.startService(schService, 0, p) then
RaiseLastWin32Error;
finally
CloseServiceHandle(schService);
end;
finally
CloseServiceHandle(schSCManager);
end;
end;
procedure TForm1.StopService(ServiceName: string);
var
schService,
schSCManager: DWORD;
p: PChar;
ss: _SERVICE_STATUS;
begin
p := nil;
schSCManager := OpenSCManager(nil, nil, MAXIMUM_ALLOWED);
if schSCManager = 0 then
RaiseLastWin32Error;
try
schService := OpenService(schSCManager, PChar(ServiceName), SERVICE_ALL_ACCESS);
if schService = 0 then
RaiseLastWin32Error;
try
if not ControlService(schService, SERVICE_CONTROL_STOP, SS) then
RaiseLastWin32Error;
finally
CloseServiceHandle(schService);
end;
finally
CloseServiceHandle(schSCManager);
end;
end;
end.