На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> работа с Сервисами , Имеются проблемы с разработкой
    :wall: У меня есть такой вопрос: я пишу сервис, который должен выступать как файловый ревизор и у меня возникли следующие вопросы:
    1. какой тип сервиса выбрать?
    2. Как наладить вывод отладочных сообщений на экран(например средствами showmessage),а то почему-то не получается:(
    3. Что делает обработчик ServiceExecute?
    Использую Delphi 2007 for win3
    Всем кто откликнется спасибо!
      Цитата DelCoderz @
      какой тип сервиса выбрать?

      По умолчанию вариант(stWin32), я думаю, вполне подойдёт, зависит от реализации ревизора(кстати, а что это?) :)
      Цитата DelCoderz @
      Как наладить вывод отладочных сообщений на экран(например средствами showmessage),а то почему-то не получается:(

      Взаимодействовать с оконной станцией могут только интерактивные сервисы, но интерактивность сервисов присутствует лишь до Win Vista. Воспользуйся текстовым логом, например из JCL(JclSimpleLog)
      Цитата DelCoderz @
      Что делает обработчик ServiceExecute?

      OnExecute позволяет полностью контролировать процесс выполнения сервиса. Т.е. в данном методе выполняется вся работа сервиса, но надо периодически уведомлять Win SCM о своём состоянии и самому завершать работу сервиса. Обычно используют события OnStart & OnStop тогда создаются рабочие потоки. По уведомлению от системы потоки останавливаются и мы это можем обрабатывать, как нам надо.

      Прочитай эту статью http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1348 там в принципе всё описано подробно.
        Эта программа будет создавать список контролируемых файлов,а затем периодически проверять их размер и некоторые другие характеристики(например образцы двоичного кода в фалйле). Будет частью opensource антивирусной системы :)
          Цитата DelCoderz @
          Эта программа будет создавать список контролируемых файлов,а затем периодически проверять их размер и некоторые другие характеристики(например образцы двоичного кода в фалйле). Будет частью opensource антивирусной системы :)

          DelCoderz, в общем я предполагаю, что на начальном этапе ты будешь всё это делать посредством WinApi :) Поэтому тип по умолчанию stWin32 тебе вполне подойдёт, подробной информации о типах сервиса на русском я вроде не встречал, поэтому, если я ошибся по поводу способа реализации, можешь начать отсюда http://msdn.microsoft.com/en-us/library/ms685996%28VS.85%29.aspx
            У меня такая проблема: мой сервис все делает как надо за искалючением одного: пишет выходные данные не в С:\, а в С:\system32. C чем это связано? Можете за одно объяснить как происходит инсталляция сервиса. Всем кто ответит большое спасибо!
              DelCoderz
              Цитата
              2. Как наладить вывод отладочных сообщений на экран(например средствами showmessage),а то почему-то не получается:(

              я бы сделал две программы, сам сервис и монитор_сообщений к нему. Монитор создает MMF и читает данные оттуда, сервис пишет в лог, и если создан MMF с нужным именем - пишет в него. Можно через пайпы (pipes) организовать "общение" двух процессов, но я предпочитаю MMF.
                если ты создаешь файл в текущей директории, это и будет С:\system32. Это связано с тем, что сервис запускается не сам, а виндовским менеджером служб. Если надо писать лог в каталог сервиса, найди путь к его EXE, например так:
                ExpandedWrap disabled
                  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 :)
                  Нет насчет ткомандной строки я знаю,но я имел ввиду как это дедлает сама система?
                    А что такое MMF
                      Уточнение по повсоду вопроса:он возник после следующего топика,где говорится
                      я бы сделал две программы, сам сервис и монитор_сообщений к нему. Монитор создает MMF и читает данные оттуда, сервис пишет в лог, и если создан MMF с нужным именем - пишет в него. Можно через пайпы (pipes) организовать "общение" двух процессов, но я предпочитаю MMF.
                        Цитата DelCoderz @
                        А что такое MMF

                        Отображаемый файл. Один из методов взаимодействия между процессами для обмена информацией. Разницы между пайпами и отображаемыми файлами (в твоем случае) - никакой - какой метод удобнее/лучше знаешь - тот и используй. На интерактивные сервисы лучше забей - иди по пути, который тебе показал antonn. И еще - при создании пайпа или ММF обрати внимание на дескрипторы безопасности (по умолчанию, если скажешь nil) объект создастся с правами локального сервиса и подключение простых смертных (не админов) к нему будет предотвращено системой. :D
                          У меня такая проблема с сервисом: в обработчике onexecute вообще не выполняется часть кода

                          Добавлено
                          Сообщение отредактировано: DelCoderz -
                            Цитата DelCoderz @
                            не выполняется часть кода

                            Она идет после условия или в цикле? проверь условие. Возможно оно всегда FALSE и компилятор выкинул эти строки.
                              Цитата DelCoderz @
                              в обработчике onexecute вообще не выполняется часть кода

                              Возможно у вас возникает исключение. Проверьте оснастку "События".
                                Вношу уточнение:не выполняется часть кода ветки else, но чято нтересно нетолько она. Не поисходит процесса записи в лог, что должно было быть Я приатачу исхоодник к посту и если то-то решиться затратить свое время на его изучение и укажет на ошибки, то буду очень-очень благодарен, а то вся разработка стоит :huh:
                                Сообщение отредактировано: DelCoderz -

                                Прикреплённый файлПрикреплённый файл_______________________.rar (197.21 Кбайт, скачиваний: 114)
                                  ExpandedWrap disabled
                                    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?
                                    DelCoderzтебя кто так учил в файл логи писать? да еще из сервиса.
                                    как минимум попробуй так:
                                    ExpandedWrap disabled
                                      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;
                                      Цитата Virtuals @
                                      DelCoderzтебя кто так учил в файл логи писать? да еще из сервиса.

                                      А зачем в файл вообще? Для этого придуманы системные журналы, а сервис специально заточен для вывода сообщений в журнал, к примеру:
                                      ExpandedWrap disabled
                                        LogMessage('COM',EVENTLOG_ERROR_TYPE, 0, 3);
                                      ИМХО - создавать свои файлы логов и протоколов работы - лишняя работа. :D
                                        Вообще алгоритм сперва надо отладить в обычном приложении и только потом - пихать его в службу.
                                          medved_68иногда в файл удобней, для отладки.
                                          CodeMonkeyна 110% потдерживаю, задача отлаживается в обычном приложении, а потом уже в сервис лепится.

                                          DelCoderz
                                          изучай
                                          try
                                          except
                                          ибо порушиш основной поток сервиса - ничего доброго не выйдет.
                                            Выложите исправленный исходник\комментыф к нему в топипожалуйста:)
                                              DelCoderz
                                              1. делаеш простую демку, у нее всего две кнопки.
                                              ExpandedWrap disabled
                                                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 и примеры с оной.
                                              :) осилиш, можно и в сервисы будет лезть., а готовый код за тебя никто писать не будет, по крайне мере в этом разделе., вот помоч, и исправить всегда пожалуйсто.
                                              ЗЫ а то что ты наваял выше, исправлению не потдается :). уж извини.
                                                Цитата CodeMonkey @
                                                medved_68иногда в файл удобней, для отладки.

                                                Да ну??? :D Virtuals, о какой отладке в сервисах ты говоришь после этого:
                                                Цитата Virtuals @
                                                CodeMonkeyна 110% потдерживаю, задача отлаживается в обычном приложении, а потом уже в сервис лепится.
                                                ??? :D Допустим, сервисов несколько десятков. Никто не будет спорить, что они должны продолжать работать независимо от результата операции (которая в них делается), оставляя в критических случаях уведомление о плохом результате??? А теперь прикинем - если сервисов несколько десятков/сотен и каждый будет писать что то в СВОЙ ОТДЕЛЬНЫЙ ЛОГФАЙЛ по СВОЕМУ УНИКАЛЬНОМУ ПУТИ и? Админ должен помнить и проверять каждый файл по присутствию на рабочем месте? Ага, счас.... :whistle: Гораздо проще посмотреть журнал событий системы, приложений и т.д., чтобы выявить, что же произошло в отсутствие. Вывод (ИМХО) - сервис, который пытается заявить о своей "уникальности" любым образом (в том числе и таким, как здесь) - подлежит немедленному удалению с полной зачисткой реестра от его следов (мое мнение как системного админа). :D
                                                Цитата Virtuals @
                                                application.ProcessMessages не использовать. (ну по крайне мере внутри StarterMon; StopMon;)

                                                Вообще не использовать! Нет и не будет в сервисе такого объекта.
                                                Цитата Virtuals @
                                                изучи try except и с чем едят эти волшебные слова.

                                                По возможности вообще отказаться от этого. Если идет работа с файловыми потоками - либо АПИ и анализ результата отработки функции, либо сначала проверка и только при положительном результате попытка работы через классы потоков. :D
                                                  Вообще для отладки удобнее всего использовать OutputDebugString.

                                                  P.S. Ссылки в тему:
                                                  Сервисы.
                                                  Отладка.
                                                    medved_68похоже мы спорим об одном и том-же :). ибо
                                                    Цитата
                                                    иногда в файл удобней, для отладки.

                                                    т.к. в процессе разработки легче следить за отдельным файлом, а не засорять мусором журнал, но в результате, да все логи в журнал. :P
                                                      Все понял спасибо начну исправлять, точнее переделывать:)
                                                        Столько лет прошло и более подходящей темы я не нашёл.
                                                        У меня вопрос по поводу логов.
                                                        Используя функцию "LogMessage" понял что этого мало, нужно ещё добавить бинарную информацию к событию.
                                                        Подскажите где копать?
                                                          АПИ: RegisterEventSource(nil,PChar(Svc.Name)) + ReportEvent(...)
                                                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                          0 пользователей:


                                                          Рейтинг@Mail.ru
                                                          [ Script execution time: 0,0595 ]   [ 17 queries used ]   [ Generated: 18.04.24, 12:36 GMT ]