Запуск\останов сервисов
От: Stimo  
Дата: 19.04.05 12:39
Оценка:
Здравствуйте..
Может, кто в курсе, как проверить, запущен ли тот или иной сервис (например, "Messenger"), и запустить его, если он не запущен?
сейчас я делаю так —
WinExec("net stop Messenger");
WinExec("net start Messenger");
но это, как я понимаю, совсем неграмотно..
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Re: Запуск\останов сервисов
От: DarkMaster Украина http://www.bdslib.at.ua
Дата: 19.04.05 13:41
Оценка:
Здравствуйте, 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;
WBR, Dmitry Beloshistov AKA [-=BDS=-]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.