Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Службы Windows или как написать Service своими руками
Форум программистов > Системное программирование > Delphi и Pascal > Delphi - Система
lazynov
Кто нибудь знает как написать в Delphi службу своими собственными руками?
Или хотя бы подскажите, где про это можно найти и суть создания/функционирования службы.
ПАЖАЛСТА! biggrin.gif
Barmutik
Просьба почитать хелп по поводу TServiceApplication

В Дельфи это делается просто создаением нового проекта Service Application
lazynov
Цитата(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
Есть такое событие у сервиса - OnExecute. Оно происходит всякий раз, когда сервис запускается. Так вот, в этом OnExecute пишете нужные Вам команды, а в конце пишете следующее:

While not Terminated do
ServiceThread.ProcessRequests(True);

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

И всё будет OK! cool.gif
lazynov
Цитата(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.
Coldfate
У Вас там есть несколько багов. Во-первых, 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
А ты сервис регистрировал-то?

Ты его вообще запускаешь как сервис, или просто по екзешнику кликаешь?
decay
А как его зарегистрировать через командную строку в xp?
Или как это можно сделать программно, какими api лучше воспользоваться?
lazynov
Цитата(decay @ 15:04:2008, 12:00 ) *
А как его зарегистрировать через командную строку в xp?
Или как это можно сделать программно, какими api лучше воспользоваться?

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


Проверь (services.msc) в свойствах твоего сервиса на закладке "Вход в систему" включено ли "Разрешить взаимодействие с рабочим столом".
decay
Silver Wind
Спасибо, как раз то, что нужно!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2008 IPS, Inc.