Версия для печати темы
Форум программистов _ Delphi - Система _ Службы Windows или как написать Service своими руками
Автор: lazynov 28:06:2006, 20:26
Кто нибудь знает как написать в Delphi службу своими собственными руками?
Или хотя бы подскажите, где про это можно найти и суть создания/функционирования службы.
ПАЖАЛСТА!
Автор: Barmutik 29:06:2006, 07:59
Просьба почитать хелп по поводу TServiceApplication
В Дельфи это делается просто создаением нового проекта Service Application
Автор: lazynov 30:06:2006, 19:45
Цитата(Barmutik @ 29:06:2006, 09:59 )

Просьба почитать хелп по поводу TServiceApplication
В Дельфи это делается просто создаением нового проекта Service Application
Спасибо!
Я почитал, но дело в том, что сервис, даже без каких либо команд не запускается!
Мои шаги:
1) file|New|Other|Service Application
2) компилируем пустой сервис
3) регистрируем сервис в системе
4) пытаемся запустить из менеджера сервисов и... облом
Ошибка! Сервис не отвечает!
И как мне теперь быть???
Автор: Coldfate 2:07:2006, 06:33
Есть такое событие у сервиса - OnExecute. Оно происходит всякий раз, когда сервис запускается. Так вот, в этом OnExecute пишете нужные Вам команды, а в конце пишете следующее:
While not Terminated do
ServiceThread.ProcessRequests(True);
А сервис не отвечает, потому что отсутствует OnExecute и сервис сразу же закрывается.
И всё будет OK!
Автор: lazynov 3:07:2006, 07:11
Цитата(Coldfate @ 2:07:2006, 08:33 )

Так вот, в этом OnExecute пишете нужные Вам команды, а в конце пишете следующее:
While not Terminated do
ServiceThread.ProcessRequests(True);
А сервис не отвечает, потому что отсутствует OnExecute и сервис сразу же закрывается.
И всё будет OK!

Ну зделал я так и все равно! Че-то не получается! Вот исходники - посмотри если не сложно...
В архиве есть файл РегСервис.exe. Копируешь на D:\ сервис с именем FreeControl.exe и жмешь кнопку register. В менеджере процессов появится Free_Control.
Автор: Coldfate 4:07:2006, 02:23
У Вас там есть несколько багов. Во-первых, ShowMessage не будет показываться никогда во время загрузки сервиса, лучше для этой цели использовать вывод в файл. А во-вторых, в моём коде написано:
Код
While not Terminated do
ServiceThread.ProcessRequests(True);
А у Вас FALSE!!!!!!
И лучше всего регистрировать сервис, запуская его с параметром /install А так вроде всё нормально.
З.Ы. И ещё: цикл While not Terminated do... нужен, чтобы сервис не заткнулся - процедура выполняется только один раз! В качестве примера можете взять это:
Код
var f: TextFile;
...
AssignFile(f, 'c:\haha.txt');
While not terminated do
begin
Append(f);
WriteLn(f, 'Привет!');
CloseFile(f);
ServiceThread.ProcessRequests(False); //А вот тут уже нужно false, чтобы сервис не ждал сообщения.
end;
Это позволит Вам проверить работоспособность сервиса...
Автор: Berkut 21:01:2007, 01:49
А ты сервис регистрировал-то?
Ты его вообще запускаешь как сервис, или просто по екзешнику кликаешь?
Автор: decay 15:04:2008, 10:00
А как его зарегистрировать через командную строку в xp?
Или как это можно сделать программно, какими api лучше воспользоваться?
Автор: lazynov 15:04:2008, 12:39
Цитата(decay @ 15:04:2008, 12:00 )

А как его зарегистрировать через командную строку в xp?
Или как это можно сделать программно, какими api лучше воспользоваться?
запусти с параметром /install - для рег
/uninstall - для дерег
Автор: decay 15:04:2008, 14:04
Спасибо, разобрался.
Ещё вопрос: сделал сервис по этому примеру: http://www.realcoding.net/article/view/4164
Если запустить его как обычное приложение, в трее видно иконку, можно потыкать в неё, показать/убрать форму настроек и т.д. Если же запустить этот пример как сервис, иконки в трее нет. Почему она не появляется?
Автор: Coldfate 16:04:2008, 06:04
Возьмите компонент TCoolTrayIcon, в нете можно скачать. Он у меня никогда не глючил, полезная штука. Ставите его на форму, задаёте иконку (свойство Icon), затем IconEnabed = True, чтобы включить иконку.
Автор: Silver Wind 16:04:2008, 06:40
Цитата(decay @ 15:04:2008 - 17:04)

Если запустить его как обычное приложение, в трее видно иконку, можно потыкать в неё, показать/убрать форму настроек и т.д. Если же запустить этот пример как сервис, иконки в трее нет. Почему она не появляется?
Проверь (services.msc) в свойствах твоего сервиса на закладке "Вход в систему" включено ли "Разрешить взаимодействие с рабочим столом".
Автор: decay 16:04:2008, 17:21
Silver Wind
Спасибо, как раз то, что нужно!
Русская версия Invision Power Board (http://www.nulled.ws)
© Invision Power Services (http://www.nulled.ws)