Службы Windows или как написать Service своими руками

  • Автор темы lazynov
  • Дата начала
Статус
Закрыто для дальнейших ответов.
L

lazynov

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

Barmutik

#2
Просьба почитать хелп по поводу TServiceApplication

В Дельфи это делается просто создаением нового проекта Service Application
 
L

lazynov

#3
Просьба почитать хелп по поводу TServiceApplication

В Дельфи это делается просто создаением нового проекта Service Application
Спасибо!
Я почитал, но дело в том, что сервис, даже без каких либо команд не запускается!
Мои шаги:
1) file|New|Other|Service Application
2) компилируем пустой сервис
3) регистрируем сервис в системе
4) пытаемся запустить из менеджера сервисов и... облом
Ошибка! Сервис не отвечает!

И как мне теперь быть??? :D :) :unsure:
 
C

Coldfate

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

While not Terminated do
ServiceThread.ProcessRequests(True);

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

И всё будет OK! :)
 
L

lazynov

#5
Так вот, в этом OnExecute пишете нужные Вам команды, а в конце пишете следующее:

While not Terminated do
ServiceThread.ProcessRequests(True);

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

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

Вложения

C

Coldfate

#6
У Вас там есть несколько багов. Во-первых, 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;
Это позволит Вам проверить работоспособность сервиса...
 
B

Berkut

#7
А ты сервис регистрировал-то?

Ты его вообще запускаешь как сервис, или просто по екзешнику кликаешь?
 

decay

Member
15.04.2008
6
0
#8
А как его зарегистрировать через командную строку в xp?
Или как это можно сделать программно, какими api лучше воспользоваться?
 

decay

Member
15.04.2008
6
0
#10
Спасибо, разобрался.
Ещё вопрос: сделал сервис по этому примеру: http://www.realcoding.net/article/view/4164
Если запустить его как обычное приложение, в трее видно иконку, можно потыкать в неё, показать/убрать форму настроек и т.д. Если же запустить этот пример как сервис, иконки в трее нет. Почему она не появляется?
 
C

Coldfate

#11
Возьмите компонент TCoolTrayIcon, в нете можно скачать. Он у меня никогда не глючил, полезная штука. Ставите его на форму, задаёте иконку (свойство Icon), затем IconEnabed = True, чтобы включить иконку.
 
S

Silver Wind

#12
Если запустить его как обычное приложение, в трее видно иконку, можно потыкать в неё, показать/убрать форму настроек и т.д. Если же запустить этот пример как сервис, иконки в трее нет. Почему она не появляется?
Проверь (services.msc) в свойствах твоего сервиса на закладке "Вход в систему" включено ли "Разрешить взаимодействие с рабочим столом".
 
Статус
Закрыто для дальнейших ответов.