Здравствуйте..
Может, кто в курсе, как проверить, запущен ли тот или иной сервис (например, "Messenger"), и запустить его, если он не запущен?
сейчас я делаю так —
WinExec("net stop Messenger");
WinExec("net start Messenger");
но это, как я понимаю, совсем неграмотно..
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Здравствуйте, Stimo, Вы писали:
S>Может, кто в курсе, как проверить, запущен ли тот или иной сервис (например, "Messenger"), и запустить его, если он не запущен?
S>сейчас я делаю так —
В курсе
S>WinExec("net stop Messenger");
S>WinExec("net start Messenger");
А ты не проверяешь — ты сначала его стопоришь, а потом заново пускаешь.
S>но это, как я понимаю, совсем неграмотно..
Через Service Manager можно...
Вот тебе кусочек исходника (максимально упрощенный, разная ненужная для понимания функциональность выброшена). По потребностям сам подгонишь.
//------------------------------------------
// состояние сервиса
//------------------------------------------
Function ServiceStateStr(AServiceState:DWORD):String;
begin
case AServiceState of
SERVICE_STOPPED :Result:='Stopped';
SERVICE_START_PENDING:Result:='Starting';
SERVICE_STOP_PENDING :Result:='Stopping';
SERVICE_RUNNING :Result:='Running';
SERVICE_CONTINUE_PENDING:Result:='Continue is pending';
SERVICE_PAUSE_PENDING:Result:='Pause is pending';
SERVICE_PAUSED :Result:='Paused';
else Result:='Uncnown state';
end;
end;
//-------------------------------------------
// возвращает список сервисов
//-------------------------------------------
Procedure GetServiceList(ShowDrivers,ShowInactive:boolean; Lst:TStrings);
const S_TYPE:array[1..2] of DWORD =(SERVICE_WIN32,SERVICE_DRIVER);
S_STATE:array[1..2] of DWORD=(SERVICE_ACTIVE,SERVICE_INACTIVE);
var schSCManager:SC_HANDLE;
SrvStatus:TSERVICEBUFFER;
TESrv:TEnumServiceStatus absolute SrvStatus;
pcbBytesNeed:DWORD;
lpServicesReturned:DWORD;
lpResumeHandle:DWORD;
cbBufSize:DWORD;
i,ImgIndex:integer;
Flag:BOOL;
Err:integer;
S_T,S_S:integer;
S_TCount,S_SCount:integer;
begin
if not Assigned(Lst) then exit;
Lst.Clear;
schSCManager:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
if schSCManager=0 then raise Exception.Create('Error open active service database!'+#13+
'Windows system error info: '+#13+
SysErrorMessage(GetLastError));
cbBufSize:=SizeOf(SrvStatus);
lpResumeHandle:=0;
if ShowDrivers then S_TCount:=2 else S_TCount:=1;
if ShowInactive then S_SCount:=2 else S_SCount:=1;
for S_T:=1 to S_TCount do
for S_S:=1 to S_SCount do
repeat
Flag:=EnumServicesStatus(schSCManager,S_TYPE[S_T],S_STATE[S_S],
TESrv,
cbBufSize,
pcbBytesNeed,
lpServicesReturned,
lpResumeHandle);
if Flag then
for i:=0 to Pred(lpServicesReturned) do
Lst.Add(String(SrvStatus[i].lpServiceName)+' '+String(SrvStatus[i].lpDisplayName)+' '+
ServiceStateStr(SrvStatus[i].ServiceStatus.dwCurrentState));
if not Flag then
begin
Err:=GetLastError;
case Err of
ERROR_ACCESS_DENIED:raise Exception.Create('Access denied! '+SysErrorMessage(GetLastError));
ERROR_INVALID_HANDLE:raise Exception.Create('Invalid handle! '+SysErrorMessage(GetLastError));
ERROR_INVALID_PARAMETER:raise Exception.Create('Invalid parameter! '+SysErrorMessage(GetLastError));
ERROR_MORE_DATA:continue;
end;
end;
until Flag;
end;