![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Программирование служб Windows на Delphi [D6, Win2k, WinXP]
Леонид Федьков © (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]
> приложение с формой. Как из него сделать службу?
А смысл ?