greenpc Да, спасибо. Я как раз на днях сделал себе юнит для рабоыт со службами. Думаю может присутствующим в этой теме он тоже пригодиться.
[more=Дальше]unit F_WinServ;
interface
uses
Windows, WinSvc;
function IsServiceExistsW(lpSvcName: PWideChar): Boolean;
function IsServiceRunningW(lpSvcName: PWideChar): Boolean;
function IsServiceStoppedW(lpSvcName: PWideChar): Boolean;
function SetStopServiceW(lpSvcName: PWideChar): Boolean;
function SetStartServiceW(lpSvcName: PWideChar): Boolean;
implementation
var
hManager: SC_HANDLE;
//
function IsServiceExistsW(lpSvcName: PWideChar): Boolean;
var
hService: SC_HANDLE;
ServStat: TServiceStatus;
begin
Result := FALSE;
hService := OpenServiceW(
hManager, //
lpSvcName, //
SERVICE_QUERY_STATUS //
);
if (hService <> 0) then
try
Result := (hService <> 0);
finally
CloseServiceHandle(hService);
end;
end;
//
function IsServiceRunningW(lpSvcName: PWideChar): Boolean;
var
hService: SC_HANDLE;
ServStat: TServiceStatus;
begin
Result := FALSE;
hService := OpenServiceW(
hManager, //
lpSvcName, //
SERVICE_QUERY_STATUS //
);
if (hService <> 0) then
try
QueryServiceStatus(
hService,
ServStat
);
Result := (ServStat.dwCurrentState = SERVICE_RUNNING);
finally
CloseServiceHandle(hService);
end;
end;
//
function IsServiceStoppedW(lpSvcName: PWideChar): Boolean;
var
hService: SC_HANDLE;
ServStat: TServiceStatus;
begin
Result := FALSE;
hService := OpenServiceW(
hManager, //
lpSvcName, //
SERVICE_QUERY_STATUS //
);
if (hService <> 0) then
try
QueryServiceStatus(
hService,
ServStat
);
Result := (ServStat.dwCurrentState = SERVICE_STOPPED);
finally
CloseServiceHandle(hService);
end;
end;
//
function SetStopServiceW(lpSvcName: PWideChar): Boolean;
var
hService: SC_HANDLE;
ServStat: TServiceStatus;
begin
Result := FALSE;
hService := OpenServiceW(
hManager, //
lpSvcName, //
SERVICE_STOP //
);
if (hService <> 0) then
try
Result := ControlService(
hService, //
SERVICE_CONTROL_STOP, //
ServStat //
);
finally
CloseServiceHandle(hService);
end;
end;
//
function SetStartServiceW(lpSvcName: PWideChar): Boolean;
var
hService: SC_HANDLE;
ArgServ : PWideChar;
begin
Result := FALSE;
hService := OpenServiceW(
hManager, //
lpSvcName, //
SERVICE_START //
);
if (hService <> 0) then
try
Result := StartServiceW(
hService, //
0, //
ArgServ //
);
finally
CloseServiceHandle(hService);
end;
end;
initialization
hManager := OpenSCManagerW(
nil, //
nil, //
SC_MANAGER_CONNECT //
);
finalization
if (hManager <> 0) then
CloseServiceHandle(
hManager
);
end.[/more]
psa1974 Загружаю диалог из ресурсов и запускаю отдельный поток при инициализации диалога. Отдельный поток нужен чтобы можно было отображать данные в листбоксе по мере продвижения результата от выполнения вспомогательных функций, а манипуляции с диалогом вплоть до интерфейса идут уже в основном потоке приложения.
ProcessMessage неохота использовать, с ним все рывками получается (по крайней мере сколько не использовал раньше код nonvcl этой процедуры, фигня какая-то, особенно сильно это хаметно когда требуется при выполнении чего-либо такого объемистого изменять размер окна, отрисовка окна капец кусками идет, да и система вопит иногда что приложение не отвечает), да и все равно поток отдельный лучше на мой взгляд, пускай себе там крутится цикл, все равно его грохнуть можно в любой момент.
[more=Сделал так, вроде работает] //
GetText := 'dhcp';
//
if IsServiceRunningW(@GetText[1]) then
begin
s := FormatW(LoadstrW(RC_STRING_SRVSTOP), [GetText]);
SendMessageW(GetDlgItem(hRtp, IDC_LISTBOX_RUNLOG), LB_ADDSTRING, 0, Integer(@s[1]));
//
if SetStopServiceW(@GetText[1]) then
begin
Sleep(5000);
// проверяем статус и если служба еще выполняется, то обрабатываем
// сообщения в очереди и заново проверяем.
while (IsServiceRunningW(@GetText[1])) do
begin
Sleep(1000);
end;
//
s := FormatW(LoadstrW(RC_STRING_SRVSTART), [GetText]);
SendMessageW(GetDlgItem(hRtp, IDC_LISTBOX_RUNLOG), LB_ADDSTRING, 0, Integer(@s[1]));
SetStartServiceW(@GetText[1]);
end;
end
else
begin
//
s := FormatW(LoadstrW(RC_STRING_SRVSTART), [GetText]);
SendMessageW(GetDlgItem(hRtp, IDC_LISTBOX_RUNLOG), LB_ADDSTRING, 0, Integer(@s[1]));
SetStartServiceW(@GetText[1]);
end;
[/more]
Всем спасибо за подсказки.