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

Вниз

Программирование служб Windows на Delphi   Найти похожие ветки 

 
Леонид Федьков   (2006-08-14 14:47) [0]

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

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


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


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


А смысл ?


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

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


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

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


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

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


 
novill ©   (2006-08-14 15:12) [5]

Вот те пример. 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 16:56) [6]

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


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

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

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


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


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


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


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


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


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

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


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

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


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


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


Для отправки сообщения нити требуется не хендл, а 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() посылает сообщение и тут же возвращает управление.


 
Ketmar ©   (2006-08-15 09:55) [11]

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


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

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

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


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

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


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

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


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


> MMF -- это что?


Memory Mapped File

см. CreateFilemapping() + MapViewOfFile()


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


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


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


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


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

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


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

> Memory Mapped File

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


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

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


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


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


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

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


 
Сергей М. ©   (2006-08-15 10:39) [17]


> Чапаев


Я бы таки настоятельно рекомендовал для интерпроцессного взаимодействия использовать не механизм win-сообщений, а именованые пайпы.


 
Чапаев ©   (2006-08-15 11:01) [18]

> [17] Сергей М. ©   (15.08.06 10:39)

Ага. Мне это сразу понравилось, просто раньше не мог додуматься, как в службе читать-писать в канал. Теперь, благодаря твоему примеру, всё прояснилось. :-)


 
Ketmar ©   (2006-08-15 14:55) [19]

> [14] Сергей М. ©   (15.08.06 10:19)
да пофигу -- что пнём об сову, что совой об пень... для одной и той же машины сокеты сеть не дёргают, так что ничем не хуже пайпов. это вопрос скорее личного вкуса. %-)


 
Сергей М. ©   (2006-08-15 15:01) [20]


> для одной и той же машины сокеты сеть не дёргают


Пайпы тоже не "дергают". Зато не тратят время на работу отнюдь не самых быстрых транспортных протоколов на базе IP


 
Чапаев ©   (2006-08-15 15:37) [21]

В XP, знаю, TCP/IP есть всегда. А в более ранних системах? В 2000, например?


 
Ketmar ©   (2006-08-15 15:38) [22]

> [20] Сергей М. ©   (15.08.06 15:01)
где-то я читал (точно не скажу уже, где), что вся работа сокетов для локалхоста ограничивается копированием буферов. не уверен, на, кажется, так.

> [21] Чапаев ©   (15.08.06 15:37)
у меня -- есть. %-)


 
Rouse_ ©   (2006-08-15 16:19) [23]


> Ketmar ©   (15.08.06 14:55) [19]
> > [14] Сергей М. ©   (15.08.06 10:19)
> да пофигу -- что пнём об сову, что совой об пень... для
> одной и той же машины сокеты сеть не дёргают, так что ничем
> не хуже пайпов. это вопрос скорее личного вкуса. %-)

На машине отсутствуют сетевые карты и MSLoopback, или присутствуют, но вместо TCP стоит IPX. Что в данном случае делать будешь?
Я как пару раз наткнулся на такие варианты, сразу отказылся от использования сокетов. Причем такие варианты стояли и в солидных конторах, которые у нас сразу по несколько десятков а то и сотен экземпляров ПО закупили, таким не скажешь - "да у вас админы тупые, настраивайте как надо", это они говорят - мы за что вам такие бешенные деньги платили, за то чтоб еще под ваши требования потом конфигурировать ПО?


 
Ketmar ©   (2006-08-15 18:12) [24]

> [23] Rouse_ ©   (15.08.06 16:19)
нет, если пишешь за большие деньги и для кого-то -- то лучше делать вообще несколько вариантов. TCP, IPX, Pipes (MailSlots? %-). а если для себя -- то сокеты рулят. %-)


 
pasha_golub ©   (2006-08-15 18:35) [25]


> Ketmar ©   (15.08.06 18:12) [24]

трубы рулят. :0)


 
Чапаев ©   (2006-08-15 18:36) [26]

> то лучше делать вообще несколько вариантов

Лучше один сделать.


 
Чапаев ©   (2006-08-15 18:39) [27]

> трубы рулят. :0)

Пока не оказывается, что прога и на 98 винде работать должна... :-(


 
pasha_golub ©   (2006-08-15 18:52) [28]


> Чапаев ©   (15.08.06 18:39) [27]

И такое бываеть. У меня на работе один Вин95 еще жив до сих пор.


 
Ketmar ©   (2006-08-15 18:53) [29]

> [27] Чапаев ©   (15.08.06 18:39)
в 98 сервисов нет. %-)


 
Чапаев ©   (2006-08-15 19:10) [30]

> [29] Ketmar ©   (15.08.06 18:53)

Нету, конечно. Просто как-то раз, помнится, написал красивое такое взаимодействие клиента и сервера через трубы, а тут -- бац! -- выясняется, что под 98 это не идёт... Пришлось через сокеты делать...


 
Ketmar ©   (2006-08-15 19:34) [31]

> [30] Чапаев ©   (15.08.06 19:10)
там ещё и мэйлслоты криво сделаны. %-)


 
Leonid Troyanovsky ©   (2006-08-15 19:39) [32]


> Чапаев ©   (15.08.06 19:10) [30]

> такое взаимодействие клиента и сервера через трубы, а тут
> -- бац! -- выясняется, что под 98 это не идёт...


Дык, его надо б было через безымянную трубу брать.

--
Regards, LVT.


 
Чапаев ©   (2006-08-15 19:44) [33]

> Дык, его надо б было через безымянную трубу брать.

Что ж... Если ещё такая оказия случится -- буду знать. :-)


 
Сергей М. ©   (2006-08-16 08:15) [34]


> Чапаев ©   (15.08.06 19:10) [30]


> выясняется, что под 98 это не идёт


Win9x не реализует лишь серверный пайп-механизм, а пайп-клиенты там работают вполне успешно.


 
Чапаев ©   (2006-08-16 08:48) [35]

Я в курсе... Но надо было, чтоб клиент и сервер могли работать как на одной машине, так и на разных. Короче, я про свой конкретный случай, а не про "трубы вообще". ;-)


 
Ketmar ©   (2006-08-16 10:03) [36]

> [35] Чапаев ©   (16.08.06 08:48)
ну вот. "на разных". даёшь сокеты! %-)



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

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

Наверх




Память: 0.56 MB
Время: 0.034 c
2-1156982136
AlDun
2006-08-31 03:55
2006.09.24
Access Violation


15-1157395719
Колдун
2006-09-04 22:48
2006.09.24
Рисование поверх всех окон


1-1155205130
Lexiy
2006-08-10 14:18
2006.09.24
DB grid


2-1157266373
PWD
2006-09-03 10:52
2006.09.24
Скопировать прямоугольную область с одного TBitmap в другой


2-1157630697
XAN
2006-09-07 16:04
2006.09.24
programma iz delphi