Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.14.130.13] |
|
Сообщ.
#1
,
|
|
|
У меня есть такой вопрос: я пишу сервис, который должен выступать как файловый ревизор и у меня возникли следующие вопросы:
1. какой тип сервиса выбрать? 2. Как наладить вывод отладочных сообщений на экран(например средствами showmessage),а то почему-то не получается:( 3. Что делает обработчик ServiceExecute? Использую Delphi 2007 for win3 Всем кто откликнется спасибо! |
Сообщ.
#2
,
|
|
|
Цитата DelCoderz @ какой тип сервиса выбрать? По умолчанию вариант(stWin32), я думаю, вполне подойдёт, зависит от реализации ревизора(кстати, а что это?) Цитата DelCoderz @ Как наладить вывод отладочных сообщений на экран(например средствами showmessage),а то почему-то не получается:( Взаимодействовать с оконной станцией могут только интерактивные сервисы, но интерактивность сервисов присутствует лишь до Win Vista. Воспользуйся текстовым логом, например из JCL(JclSimpleLog) Цитата DelCoderz @ Что делает обработчик ServiceExecute? OnExecute позволяет полностью контролировать процесс выполнения сервиса. Т.е. в данном методе выполняется вся работа сервиса, но надо периодически уведомлять Win SCM о своём состоянии и самому завершать работу сервиса. Обычно используют события OnStart & OnStop тогда создаются рабочие потоки. По уведомлению от системы потоки останавливаются и мы это можем обрабатывать, как нам надо. Прочитай эту статью http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1348 там в принципе всё описано подробно. |
Сообщ.
#3
,
|
|
|
Эта программа будет создавать список контролируемых файлов,а затем периодически проверять их размер и некоторые другие характеристики(например образцы двоичного кода в фалйле). Будет частью opensource антивирусной системы
|
Сообщ.
#4
,
|
|
|
Цитата DelCoderz @ Эта программа будет создавать список контролируемых файлов,а затем периодически проверять их размер и некоторые другие характеристики(например образцы двоичного кода в фалйле). Будет частью opensource антивирусной системы DelCoderz, в общем я предполагаю, что на начальном этапе ты будешь всё это делать посредством WinApi Поэтому тип по умолчанию stWin32 тебе вполне подойдёт, подробной информации о типах сервиса на русском я вроде не встречал, поэтому, если я ошибся по поводу способа реализации, можешь начать отсюда http://msdn.microsoft.com/en-us/library/ms685996%28VS.85%29.aspx |
Сообщ.
#5
,
|
|
|
У меня такая проблема: мой сервис все делает как надо за искалючением одного: пишет выходные данные не в С:\, а в С:\system32. C чем это связано? Можете за одно объяснить как происходит инсталляция сервиса. Всем кто ответит большое спасибо!
|
Сообщ.
#6
,
|
|
|
DelCoderz
Цитата 2. Как наладить вывод отладочных сообщений на экран(например средствами showmessage),а то почему-то не получается:( я бы сделал две программы, сам сервис и монитор_сообщений к нему. Монитор создает MMF и читает данные оттуда, сервис пишет в лог, и если создан MMF с нужным именем - пишет в него. Можно через пайпы (pipes) организовать "общение" двух процессов, но я предпочитаю MMF. |
Сообщ.
#7
,
|
|
|
если ты создаешь файл в текущей директории, это и будет С:\system32. Это связано с тем, что сервис запускается не сам, а виндовским менеджером служб. Если надо писать лог в каталог сервиса, найди путь к его EXE, например так:
var p:array [0..255] of Char; lpFileName:PChar; nSize:DWORD; begin lpFileName:=@p[0]; nSize:=255; if GetModuleFileName(0,lpFileName,nSize )>0 then result:=String(ExtractFilePath(lpFileName)) Инсталляция сервиса делается так: myservice /install |
Сообщ.
#8
,
|
|
|
Нет насчет ткомандной строки я знаю,но я имел ввиду как это дедлает сама система?
|
Сообщ.
#9
,
|
|
|
А что такое MMF
|
Сообщ.
#10
,
|
|
|
Уточнение по повсоду вопроса:он возник после следующего топика,где говорится
я бы сделал две программы, сам сервис и монитор_сообщений к нему. Монитор создает MMF и читает данные оттуда, сервис пишет в лог, и если создан MMF с нужным именем - пишет в него. Можно через пайпы (pipes) организовать "общение" двух процессов, но я предпочитаю MMF. |
Сообщ.
#11
,
|
|
|
Цитата DelCoderz @ А что такое MMF Отображаемый файл. Один из методов взаимодействия между процессами для обмена информацией. Разницы между пайпами и отображаемыми файлами (в твоем случае) - никакой - какой метод удобнее/лучше знаешь - тот и используй. На интерактивные сервисы лучше забей - иди по пути, который тебе показал antonn. И еще - при создании пайпа или ММF обрати внимание на дескрипторы безопасности (по умолчанию, если скажешь nil) объект создастся с правами локального сервиса и подключение простых смертных (не админов) к нему будет предотвращено системой. |
Сообщ.
#12
,
|
|
|
У меня такая проблема с сервисом: в обработчике onexecute вообще не выполняется часть кода
Добавлено |
Сообщ.
#13
,
|
|
|
Цитата DelCoderz @ не выполняется часть кода Она идет после условия или в цикле? проверь условие. Возможно оно всегда FALSE и компилятор выкинул эти строки. |
Сообщ.
#14
,
|
|
|
Цитата DelCoderz @ в обработчике onexecute вообще не выполняется часть кода Возможно у вас возникает исключение. Проверьте оснастку "События". |
Сообщ.
#15
,
|
|
|
Вношу уточнение:не выполняется часть кода ветки else, но чято нтересно нетолько она. Не поисходит процесса записи в лог, что должно было быть Я приатачу исхоодник к посту и если то-то решиться затратить свое время на его изучение и укажет на ошибки, то буду очень-очень благодарен, а то вся разработка стоит
Прикреплённый файл_______________________.rar (197.21 Кбайт, скачиваний: 114) |
Сообщ.
#16
,
|
|
|
procedure TService1.ServiceExecute(Sender: TService); var listfile:string; i:integer; t:MyFI; f:file of MyFI; f1:textfile; begin Service1.ReportStatus;//не знаю нужно это? i:=0; assignfile(f1,'C:\log.txt'); Rewrite(f1); Close(f1); listfile:='C:\SpisF.fd'; if not FileExists(listfile) then//проверяем: список составлен? begin//НЕТ Shell('','*.exe',true); //составляем список все функции поисковика, включая shell //в модуле RealiseFunc GetSize(listfile); end else begin Append(f1); А где файл открыт для Append? |
Сообщ.
#17
,
|
|
|
DelCoderzтебя кто так учил в файл логи писать? да еще из сервиса.
как минимум попробуй так: function FileIsThere(FileName: string): Boolean; { Boolean function that returns True if the file exists; otherwise, it returns False. Closes the file if it exists. } var F: file; begin {$I-} AssignFile(F, FileName); FileMode := 0; {Set file access to read only } Reset(F); CloseFile(F); {$I+} FileIsThere := (IOResult = 0) and (FileName <> ''); end; { FileIsThere } procedure ERRLog(S:String); Var Ft:TextFile; begin AssignFile(Ft,'c:\logfile.log'); if FileIsThere('c:\logfile.log') then Append(Ft) else ReWrite(Ft); Writeln(Ft,S); close(Ft); end; |
Сообщ.
#18
,
|
|
|
Цитата Virtuals @ DelCoderzтебя кто так учил в файл логи писать? да еще из сервиса. А зачем в файл вообще? Для этого придуманы системные журналы, а сервис специально заточен для вывода сообщений в журнал, к примеру: LogMessage('COM',EVENTLOG_ERROR_TYPE, 0, 3); |
Сообщ.
#19
,
|
|
|
Вообще алгоритм сперва надо отладить в обычном приложении и только потом - пихать его в службу.
|
Сообщ.
#20
,
|
|
|
medved_68иногда в файл удобней, для отладки.
CodeMonkeyна 110% потдерживаю, задача отлаживается в обычном приложении, а потом уже в сервис лепится. DelCoderz изучай try except ибо порушиш основной поток сервиса - ничего доброго не выйдет. |
Сообщ.
#21
,
|
|
|
Выложите исправленный исходник\комментыф к нему в топипожалуйста:)
|
Сообщ.
#22
,
|
|
|
DelCoderz
1. делаеш простую демку, у нее всего две кнопки. procedure StarterMon; begin ... end; procedure StopMon; begin ... end; procedure TForm1.Button1Click(Sender: TObject); begin StarterMon; end; procedure TForm1.Button2Click(Sender: TObject); begin StopMon; end; в процедурах StarterMon; StopMon; пишеш свой код. условия: 1. приложение не должно подвисать! 2. application.ProcessMessages не использовать. (ну по крайне мере внутри StarterMon; StopMon;) 3. никаких вылетов не должно быть ни при каких условиях (ну там нет файла, нет файла лога, файл лога только чтение, файл лога открыть эксклюзивно кем-то другим,... и т.д.) 4. ничего на экран не выводится, только в лог. советы: 1. изучи try except и с чем едят эти волшебные слова. 2. при открытии файлов, стоит проверить а есть ли он. 3. что есть потоки и что за функция такая CreateThread и примеры с оной. осилиш, можно и в сервисы будет лезть., а готовый код за тебя никто писать не будет, по крайне мере в этом разделе., вот помоч, и исправить всегда пожалуйсто. ЗЫ а то что ты наваял выше, исправлению не потдается . уж извини. |
Сообщ.
#23
,
|
|
|
Цитата CodeMonkey @ medved_68иногда в файл удобней, для отладки. Да ну??? Virtuals, о какой отладке в сервисах ты говоришь после этого: Цитата Virtuals @ ??? Допустим, сервисов несколько десятков. Никто не будет спорить, что они должны продолжать работать независимо от результата операции (которая в них делается), оставляя в критических случаях уведомление о плохом результате??? А теперь прикинем - если сервисов несколько десятков/сотен и каждый будет писать что то в СВОЙ ОТДЕЛЬНЫЙ ЛОГФАЙЛ по СВОЕМУ УНИКАЛЬНОМУ ПУТИ и? Админ должен помнить и проверять каждый файл по присутствию на рабочем месте? Ага, счас.... Гораздо проще посмотреть журнал событий системы, приложений и т.д., чтобы выявить, что же произошло в отсутствие. Вывод (ИМХО) - сервис, который пытается заявить о своей "уникальности" любым образом (в том числе и таким, как здесь) - подлежит немедленному удалению с полной зачисткой реестра от его следов (мое мнение как системного админа). CodeMonkeyна 110% потдерживаю, задача отлаживается в обычном приложении, а потом уже в сервис лепится. Цитата Virtuals @ application.ProcessMessages не использовать. (ну по крайне мере внутри StarterMon; StopMon;) Вообще не использовать! Нет и не будет в сервисе такого объекта. Цитата Virtuals @ изучи try except и с чем едят эти волшебные слова. По возможности вообще отказаться от этого. Если идет работа с файловыми потоками - либо АПИ и анализ результата отработки функции, либо сначала проверка и только при положительном результате попытка работы через классы потоков. |
Сообщ.
#24
,
|
|
|
Сообщ.
#25
,
|
|
|
medved_68похоже мы спорим об одном и том-же . ибо
Цитата иногда в файл удобней, для отладки. т.к. в процессе разработки легче следить за отдельным файлом, а не засорять мусором журнал, но в результате, да все логи в журнал. |
Сообщ.
#26
,
|
|
|
Все понял спасибо начну исправлять, точнее переделывать:)
|
Сообщ.
#27
,
|
|
|
Столько лет прошло и более подходящей темы я не нашёл.
У меня вопрос по поводу логов. Используя функцию "LogMessage" понял что этого мало, нужно ещё добавить бинарную информацию к событию. Подскажите где копать? |
Сообщ.
#28
,
|
|
|
АПИ: RegisterEventSource(nil,PChar(Svc.Name)) + ReportEvent(...)
|