Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум программистов _ Delphi - Система _ Службы Windows или как написать Service своими руками

Автор: lazynov 28:06:2006, 20:26

Кто нибудь знает как написать в Delphi службу своими собственными руками?
Или хотя бы подскажите, где про это можно найти и суть создания/функционирования службы.
ПАЖАЛСТА! biggrin.gif

Автор: 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) пытаемся запустить из менеджера сервисов и... облом
Ошибка! Сервис не отвечает!

И как мне теперь быть??? unsure.gif unsure.gif unsure.gif

Автор: Coldfate 2:07:2006, 06:33

Есть такое событие у сервиса - OnExecute. Оно происходит всякий раз, когда сервис запускается. Так вот, в этом OnExecute пишете нужные Вам команды, а в конце пишете следующее:

While not Terminated do
ServiceThread.ProcessRequests(True);

А сервис не отвечает, потому что отсутствует OnExecute и сервис сразу же закрывается.

И всё будет OK! cool.gif

Автор: lazynov 3:07:2006, 07:11

Цитата(Coldfate @ 2:07:2006, 08:33 ) *
Так вот, в этом OnExecute пишете нужные Вам команды, а в конце пишете следующее:

While not Terminated do
ServiceThread.ProcessRequests(True);

А сервис не отвечает, потому что отсутствует OnExecute и сервис сразу же закрывается.

И всё будет OK! cool.gif

Ну зделал я так и все равно! Че-то не получается! Вот исходники - посмотри если не сложно...
В архиве есть файл РегСервис.exe. Копируешь на D:\ сервис с именем FreeControl.exe и жмешь кнопку register. В менеджере процессов появится Free_Control.

 FreeControlServer.rar ( 412.72 килобайт ) : 243
 

Автор: 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)