Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.043 c
14-1105615269
AndB
2005-01-13 14:21
2005.01.30
E-BUKI


1-1105953060
SeregaMan
2005-01-17 12:11
2005.01.30
Раскладка клавиатуры


1-1106109186
Marat
2005-01-19 07:33
2005.01.30
Ошибка в FormShow


14-1105281755
AdmeraL
2005-01-09 17:42
2005.01.30
бинарные данные?


6-1100034718
able
2004-11-10 00:11
2005.01.30
TServerSocket число соединений





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский