Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Программирование служб Windows на Delphi [D6, Win2k, WinXP]


Страницы:   1 2

Леонид Федьков ©   (2006-08-14 14:47:00) 

Уважаемые знатоки!
Подскажите, если кто занимался:
1. Где можно посмотреть
программирование служб Windows на Delphi с примерами?
Может у вас есть пример?
2. Есть приложение с формой. Как из него сделать службу?

С благодарностью       Леонид Федьков.


Сергей М.   (2006-08-15 10:36:00) [21]


> MMF в данном случае... Не из пушки по воробьям?


Может и так ..
Но в прогр.реализации это проще, чем иные способы "публикования" подобного рода инф-ции.

Вот еще вариант "публикования" : для главного окна сервис-приложения установить св-во (см. SetProp), являющее собой строку с текстовым представлением ID нити сервиса. Тогда любой процесс того же десктопа может найдя интересующее окно прочитать это св-во (GetProp). Но это оправдано лишь в случае когда сервис-приложение реализует один-единственный сервис, а не множество сервисов (что вполне нормально).


Чапаев   (2006-08-15 10:27:00) [22]

> Memory Mapped File

Ясно. Просто с аббревиатурой не сталкивался. Только вот MMF в данном случае... Не из пушки по воробьям?


> Подобный цикл должен фигурировать в обработчике TService.OnExecute

Ага... Попробую, спасибо.


Сергей М.   (2006-08-15 10:19:00) [23]


> Ketmar ©   (15.08.06 09:55) [11]
>
> интересно, почему так усиленно игноритуют сокеты


Если не требуется удаленное взаимодействие с сервисом, то сокеты тут вряд ли оправданы.

А если и требуется, то при условии гомогенной сет.опер.среды разумнее использовать NamedPipes. Да и в гетерогенной пайпы тоже можно юзать - *nix-системы поддерживают пайп-технологию.


Сергей М.   (2006-08-15 10:14:00) [24]


> MMF -- это что?


Memory Mapped File

см. CreateFilemapping() + MapViewOfFile()


> как к этому добраться в Service Application?


Подобный цикл должен фигурировать в обработчике TService.OnExecute


Чапаев   (2006-08-15 10:09:00) [25]

> Нить сервиса может записать свой ID, например, в MMF.

Так. А MMF -- это что?


> цикл следует организовать примерно так

Это понятно. Но как к этому добраться в Service Application?


> Не оконная ф-ция, а ф-ция SendMessage().

Понял. Не сообразил сразу, к чему синхронность относится.


Ketmar   (2006-08-15 09:55:00) [26]

интересно, почему так усиленно игноритуют сокеты, при помощи которых можно очень удобно реализовать это самое общение? плюс -- при желании -- даже удалённое администрирование сервиса?


Сергей М.   (2006-08-15 09:51:00) [27]


> Как получить хэндл потока службы?


Для отправки сообщения нити требуется не хендл, а ID нити.

Нить сервиса может записать свой ID, например, в MMF.


> Как в обработчик сообщений потока вставить реакцию на пользовательское
> событие?


цикл следует организовать примерно так (как вариант) :

while not Terminated do begin
 WaitMessage;
 if PeekMessage(Msg, -1, TM_FIRST_MSG, TM_TM_LAST_MSG, PM_REMOVE) then
   Dispatch(Msg.Message)
 else
   ProcessRequests(False);
end;


> оконная функция -- синхронна?


Не оконная ф-ция, а ф-ция SendMessage().
Она вернет управление послеобработки целевым окном посылаемого ему сообщения, в то время как PostThreadMessage() посылает сообщение и тут же возвращает управление.


Чапаев   (2006-08-15 09:36:00) [28]


> Не нужно никаких окон.
> Сообщение м.б. послано не только окну, но и нити.
> См. PostThreadMessage().
> Единственное ограничение - асинхронность вышеупомянутой
> ф-ции.

В теории я это знаю, а вот на практике... Как получить хэндл потока службы? Как в обработчик сообщений потока вставить реакцию на пользовательское событие? Речь идёт не о "службе с нуля", а о делфовом service application.


> Единственное ограничение - асинхронность вышеупомянутой
> ф-ции.

Немножко не понял... А оконная функция -- синхронна?


Сергей М.   (2006-08-15 08:09:00) [29]


> Чапаев ©   (14.08.06 19:57) [7]


> ничего лучше не придумал, чем сотворить невидимое окно и
> ему сообщения слать


Не нужно никаких окон.
Сообщение м.б. послано не только окну, но и нити.
См. PostThreadMessage().
Единственное ограничение - асинхронность вышеупомянутой ф-ции.


Чапаев   (2006-08-14 19:57:00) [30]

> win-сообщения

А вот как бы с минимальными усилиями обмениваться сообщениями с делфовым service application? Я ничего лучше не придумал, чем сотворить невидимое окно и ему сообщения слать...


Леонид Федьков   (2006-08-14 16:56:00) [31]

Всем спасибо!


novill   (2006-08-14 15:12:00) [32]

Вот те пример. File->New->Other->Service application

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs;

type
 TService1 = class(TService)
   procedure ServiceExecute(Sender: TService);
 private
   { Private declarations }
 public
   function GetServiceController: TServiceController; override;
   { Public declarations }
 end;

var
 Service1: TService1;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
 Service1.Controller(CtrlCode);
end;

function TService1.GetServiceController: TServiceController;
begin
 Result := ServiceController;
end;

{на событие OnExecute повесь след процедуру}
procedure TService1.ServiceExecute(Sender: TService);
begin
    while not Self.Terminated do
     begin
        ServiceThread.ProcessRequests(False);
        {твои процедуры}
       end;
     end;
end;

end.


С использованием форм будет много проблем. Почему - RTFM.
Лучше пусть просмотром занимается самостоятельная прога.


Сергей М.   (2006-08-14 15:05:00) [33]

Переделывать же "одним махом" готовое GUI-приложение в сервис не только нежелательно, но и зачастую невозможно.


Сергей М.   (2006-08-14 15:04:00) [34]

Это делается не так.
Реализуется отдельное приложение-служба (безо всяких форм), манипулирующая некими данными.
Реализуется приложение-апплет панели управления (с нужными формами), для вывода и просмотра тех самых "определённых данных".
Взаимодействие между сервисом и апплетом осуществляется любым подходящим и удобным способом - NamedPipes, TCP/IP, MMF, win-сообщения


Леонид Федьков   (2006-08-14 14:53:00) [35]

Сергею.
Для вывода и просмотра определённых данных, собираемых службой.


Сергей М.   (2006-08-14 14:50:00) [36]


> приложение с формой. Как из него сделать службу?


А смысл ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо