Помощник
Здравствуйте, гость ( Вход | Регистрация )
|
|
28:06:2006, 20:26
|
|
Новенький ![]() Группа: Программист Сообщений: 43 Регистрация: 14:05:2006 Пользователь №: 4 201 Репутация: 1
|
Кто нибудь знает как написать в Delphi службу своими собственными руками?
Или хотя бы подскажите, где про это можно найти и суть создания/функционирования службы. ПАЖАЛСТА! |
|
Сообщение
#1
|
|
![]() |
|
|
29:06:2006, 07:59
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 2 450 Регистрация: 27:05:2004 Из: Минск Пользователь №: 561 Специализация: Delphi, RDBMS, C# Репутация: 8
|
Просьба почитать хелп по поводу TServiceApplication
В Дельфи это делается просто создаением нового проекта Service Application |
|
Сообщение
#2
|
|
|
|
30:06:2006, 19:45
|
|
Новенький ![]() Группа: Программист Сообщений: 43 Регистрация: 14:05:2006 Пользователь №: 4 201 Репутация: 1
|
Просьба почитать хелп по поводу TServiceApplication В Дельфи это делается просто создаением нового проекта Service Application Спасибо! Я почитал, но дело в том, что сервис, даже без каких либо команд не запускается! Мои шаги: 1) file|New|Other|Service Application 2) компилируем пустой сервис 3) регистрируем сервис в системе 4) пытаемся запустить из менеджера сервисов и... облом Ошибка! Сервис не отвечает! И как мне теперь быть??? |
|
Сообщение
#3
|
|
|
|
2:07:2006, 06:33
|
|
Новенький ![]() Группа: Программист Сообщений: 47 Регистрация: 8:06:2006 Из: Амбер Пользователь №: 4 695 Специализация: Программист Репутация: 1
|
Есть такое событие у сервиса - OnExecute. Оно происходит всякий раз, когда сервис запускается. Так вот, в этом OnExecute пишете нужные Вам команды, а в конце пишете следующее:
While not Terminated do ServiceThread.ProcessRequests(True); А сервис не отвечает, потому что отсутствует OnExecute и сервис сразу же закрывается. И всё будет OK! |
|
Сообщение
#4
|
|
|
|
3:07:2006, 07:11
|
|
Новенький ![]() Группа: Программист Сообщений: 43 Регистрация: 14:05:2006 Пользователь №: 4 201 Репутация: 1
|
Так вот, в этом OnExecute пишете нужные Вам команды, а в конце пишете следующее: While not Terminated do ServiceThread.ProcessRequests(True); А сервис не отвечает, потому что отсутствует OnExecute и сервис сразу же закрывается. И всё будет OK! Ну зделал я так и все равно! Че-то не получается! Вот исходники - посмотри если не сложно... В архиве есть файл РегСервис.exe. Копируешь на D:\ сервис с именем FreeControl.exe и жмешь кнопку register. В менеджере процессов появится Free_Control.
Прикрепленные файлы
|
|
Сообщение
#5
|
|
|
|
4:07:2006, 02:23
|
|
Новенький ![]() Группа: Программист Сообщений: 47 Регистрация: 8:06:2006 Из: Амбер Пользователь №: 4 695 Специализация: Программист Репутация: 1
|
У Вас там есть несколько багов. Во-первых, 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; Это позволит Вам проверить работоспособность сервиса... |
|
Сообщение
#6
|
|
|
|
21:01:2007, 01:49
|
|
Новенький ![]() Группа: Программист Сообщений: 6 Регистрация: 21:01:2007 Пользователь №: 8 887 Репутация: 0
|
А ты сервис регистрировал-то?
Ты его вообще запускаешь как сервис, или просто по екзешнику кликаешь? |
|
Сообщение
#7
|
|
|
|
15:04:2008, 10:00
|
|
Новенький ![]() Группа: Программист Сообщений: 3 Регистрация: 15:04:2008 Пользователь №: 16 644 Репутация: 0
|
А как его зарегистрировать через командную строку в xp?
Или как это можно сделать программно, какими api лучше воспользоваться? |
|
Сообщение
#8
|
|
|
|
15:04:2008, 12:39
|
|
Новенький ![]() Группа: Программист Сообщений: 43 Регистрация: 14:05:2006 Пользователь №: 4 201 Репутация: 1
|
|
|
Сообщение
#9
|
|
|
|
15:04:2008, 14:04
|
|
Новенький ![]() Группа: Программист Сообщений: 3 Регистрация: 15:04:2008 Пользователь №: 16 644 Репутация: 0
|
Спасибо, разобрался.
Ещё вопрос: сделал сервис по этому примеру: http://www.realcoding.net/article/view/4164 Если запустить его как обычное приложение, в трее видно иконку, можно потыкать в неё, показать/убрать форму настроек и т.д. Если же запустить этот пример как сервис, иконки в трее нет. Почему она не появляется? |
|
Сообщение
#10
|
|
|
|
16:04:2008, 06:04
|
|
Новенький ![]() Группа: Программист Сообщений: 47 Регистрация: 8:06:2006 Из: Амбер Пользователь №: 4 695 Специализация: Программист Репутация: 1
|
Возьмите компонент TCoolTrayIcon, в нете можно скачать. Он у меня никогда не глючил, полезная штука. Ставите его на форму, задаёте иконку (свойство Icon), затем IconEnabed = True, чтобы включить иконку.
|
|
Сообщение
#11
|
|
|
|
16:04:2008, 06:40
|
|
Новенький ![]() Группа: Программист Сообщений: 99 Регистрация: 30:07:2007 Из: Витебск Пользователь №: 12 080 Специализация: программист Репутация: 6
|
Если запустить его как обычное приложение, в трее видно иконку, можно потыкать в неё, показать/убрать форму настроек и т.д. Если же запустить этот пример как сервис, иконки в трее нет. Почему она не появляется? Проверь (services.msc) в свойствах твоего сервиса на закладке "Вход в систему" включено ли "Разрешить взаимодействие с рабочим столом". |
|
Сообщение
#12
|
|
|
|
16:04:2008, 17:21
|
|
Новенький ![]() Группа: Программист Сообщений: 3 Регистрация: 15:04:2008 Пользователь №: 16 644 Репутация: 0
|
Silver Wind
Спасибо, как раз то, что нужно! |
|
Сообщение
#13
|
|
![]() |
|
Текстовая версия | Сейчас: 17:05:2008 - 06:04 |