Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.30;
Скачать: CL | DM;

Вниз

Управление процессом (сервисом)   Найти похожие ветки 

 
dr Tr0jan   (2004-12-08 11:31) [0]

Как можно управлять из одной программы другой? Т.е. я хочу сделать программу управления сервисом (не только включение/выключение, но и другие функции). Сообщения сразу отпадают - у сервиса нет формы.


 
Rouse_ ©   (2004-12-08 11:36) [1]

Вот тебе несколько примерчиков:

// остановка сервиса
// =============================================================================
function TfrmGSServerSetting.ServiceStop(const ServiceName: String): Boolean;
var
 SCManager, Service: SC_HANDLE;
 ServiceStatus: TServiceStatus;
begin
 Result := IsServiceRunning(ServiceName);
 if not Result then
 begin
   Result := True;
   Exit;
 end;
 SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
 if SCManager = 0 then
 begin
   ShowMessage(SysErrorMessage(GetLastError));
   Exit;
 end;
 try
   Service := OpenService(SCManager, PChar(ServiceName), SERVICE_STOP);
   if Service = 0 then
   begin
     ShowMessage(SysErrorMessage(GetLastError));
     Exit;
   end;
   try
     if not ControlService(Service, SERVICE_CONTROL_STOP, ServiceStatus)
       and (ServiceStatus.dwCurrentState = SERVICE_STOPPED) then
     begin
       ShowMessage(SysErrorMessage(GetLastError));
       Exit;
     end;
     Result := True;
   finally
     CloseServiceHandle(Service);
   end;
 finally
   CloseServiceHandle(SCManager);
 end;
end;

//  Проверка активности сервиса
// =============================================================================
function TfrmGSServerSetting.IsServiceRunning(const ServiceName: String): Boolean;
var
 SCManager, Service: SC_HANDLE;
 ServiceStatus: TServiceStatus;
begin
 SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
 if SCManager <> 0 then
 try
   Service := OpenService(SCManager, PChar(ServiceName), SERVICE_QUERY_STATUS);
   if Service <> 0 then
   try
     Result := QueryServiceStatus(Service, ServiceStatus) and
     (ServiceStatus.dwCurrentState = SERVICE_RUNNING);
   finally
     CloseServiceHandle(Service);
   end
   else
     Result := False;
 finally
   CloseServiceHandle(SCManager);
 end
 else
   Result := False;
end;

//  Запуск сервиса
// =============================================================================
procedure TfrmGSServerSetting.btnStartClick(Sender: TObject);
var
 SCManager, Service: SC_HANDLE;
 P: PChar;
begin
 if not DirectoryExists(Settings.AObject) then
   if not FileExists(Settings.AObject) then
 begin
   MessageBox(Handle, "Укажите правильный путь к объекту.", "Ошибка...",
         MB_OK or MB_ICONERROR);
   Exit;
 end;

 SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
 if SCManager <> 0 then
 try
   Service := OpenService(SCManager, "Listener", SERVICE_START);
   if Service <> 0 then
   try
     P := nil;
     if not StartService(Service, 0, P) then
     begin
       ShowMessage(SysErrorMessage(GetLastError));
       Exit;
     end;
     btnStopStart.Enabled := True;
     btnClose.Enabled := True;
     btnStart.Enabled := False;
   finally
     CloseServiceHandle(Service);
   end;
 finally
   CloseServiceHandle(SCManager);
 end;
end;

//  Нотификация сервиса об изменении настроек
// =============================================================================
procedure TfrmGSServerSetting.NotifyService;
var
 SCManager, Service: SC_HANDLE;
 ServiceStatus: TServiceStatus;
begin
 SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
 if SCManager <> 0 then
 try
   Service := OpenService(SCManager, "Listener", SERVICE_PAUSE_CONTINUE);
   if Service <> 0 then
   try
     if not ControlService(Service, SERVICE_CONTROL_PARAMCHANGE, ServiceStatus) then
     begin
       ShowMessage(SysErrorMessage(GetLastError));
       Exit;
     end;
   finally
     CloseServiceHandle(Service);
   end;
 finally
   CloseServiceHandle(SCManager);
 end
end;


 
dr Tr0jan   (2004-12-08 12:20) [2]

Первые три я знал, а за последний - респект.


 
Digitman ©   (2004-12-08 12:28) [3]


> Сообщения сразу отпадают - у сервиса нет формы


а причем здесь есть форма или нет ее ?
сообщения посылаются системой трэду, а не форме


 
dr Tr0jan   (2004-12-08 13:09) [4]

Ну ведь сообщения посылаются по адресу (который есть - дескриптор окна). Что такое тред?


 
Digitman ©   (2004-12-08 13:40) [5]


> Ну ведь сообщения посылаются по адресу (который есть - дескриптор
> окна).


не обязательно
сообщения могут быть адресованы и непосредственно трэду

в любом случае очередь сообщений создается (по требованию) для треда, а не для окон, им создаваемых, каковых может не быть вообще или быть более чем одно

трэд же, выбирая из этой очереди сообщения, анализирует кому оно адресовано - то ли ему непосредственно, то ли какому-либо окну, им созданному, и в зависимости от этого диспетчеризует/обрабатывает эти сообщения

касаемо же отсутствия формы - формы как VCL-объекта может и не быть, но ничто не мешает в контексте трэда создать окно как ОС-объект непосредственно на WinAPI


> Что такое тред?


тред = thread, кодовый поток процесса



Страницы: 1 вся ветка

Текущий архив: 2005.01.30;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.024 c
14-1105583894
Kerk
2005-01-13 05:38
2005.01.30
lol. htaccess magic


3-1103831482
Vitaliy
2004-12-23 22:51
2005.01.30
Автоширина столбцов DBGrid


3-1104240289
}|{yk
2004-12-28 16:24
2005.01.30
Firebird и захват сервером 99% CPU


1-1105599183
Itsme
2005-01-13 09:53
2005.01.30
Delphi7 + Excel XP


3-1104225898
Tovarish Pronin
2004-12-28 12:24
2005.01.30
Как в DBGrid отобразить значения поля типа ftBytes?