На главную Наши проекты:
Журнал   ·   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
  
> Не работает цикл в службе win32
    Добрый день!

    В службе почему-то не выполняется цикл. Пробовал разные циклы (While, repeat). Весь остальной код выполняется, кроме содержимого цикла. Видимо, что-то не так делаю. Подскажите, в чем нюанс? Служба стартует, опрашивает ini, читает из него путь в InBox (E:\inbox\) и должна просмотреть список файлов в этой папке. Все действия службы пушиться в Лог. Вот код процедуры службы:

    ExpandedWrap disabled
      procedure ToService.ServiceExecute(Sender: TService);
      var
        FSO,FSW: TFileStream;
        FLog, Fini: TextFile;
        LogFileName,IniFileName, InBox, OutBox, FlagBox: string[255];
        STime, Attr, FindRes : integer;
        CoProc, FIB : byte;
        TmpSt : String;
        sr: TSearchRec;
      begin
        LogFileName := extractfilepath(paramstr(0))+FormatDateTime('yyyymmdd-hhmm',Now)+'-oSRV.log';
        IniFileName := extractfilepath(paramstr(0))+'oservice.ini';
        AssignFile(FLog, LogFileName);
        Rewrite(FLog);
        Writeln(FLog, FormatDateTime('yyyy.mm.dd-hh:mm',Now)+' Service is Started.');
        AssignFile(Fini, IniFileName);
        Reset(FIni);
        Readln(FIni, TmpSt);
        STime := StrToInt(TmpSt);
        Readln(FIni, TmpSt);
        CoProc := Byte(StrToInt(TmpSt));
        Readln(FIni, InBox);
        Readln(FIni, OutBox);
        Readln(FIni, FlagBox);
        CloseFile(Fini);
        Writeln(FLog, IntToStr(STime));
        Writeln(FLog, IntToStr(CoProc));
        Writeln(FLog, InBox);
        Writeln(FLog, OutBox);
        Writeln(FLog, FlagBox);
        Writeln(FLog, 'File-scan-start');
       
        FindRes:=FindFirst(InBox+'*.*',faAnyFile,SR); //поиск
        While FindRes=0 do
          begin
            if ((SR.Attr and faDirectory)=faDirectory) and
            ((SR.Name='.')or(SR.Name='..')) then  // все папки и файлы
               begin
                  Writeln(FLog, sr.Name);
                  FindRes:=FindNext(SR); // продолжить поиск
                  Continue; // продолжить цикл
               end;
            Writeln(FLog, 'File-2');
            Writeln(FLog, sr.Name);
            FindRes:=FindNext(SR); // продолжить поиск
          end;
        FindClose(SR); //закрвть(остановить)поиск
        Writeln(FLog, 'File-scan-stop');
       
        CloseFile(FLog);
      end;
    Сообщение отредактировано: Krid -
      В обычном приложении проверял работу поиска?
        Цитата MBo @
        В обычном приложении проверял работу поиска?

        Да, работает.
          Обычно сервис запускается от имени системы, если он зарегистрирован от имени системы.
          У системы может не быть прав доступа в папку с теми файлами, поэтому цикл не отрабатывает. Т.е. у обычного приложения, в котором отрабатывает цикл все работает потому, что у учётной записи пользователя есть права на чтение папки. У сервиса их может не быть, если он запускается от другой учетной записи (например от имени system).
          Рекомендую проверить права папки.
          И при отладке сервиса глянуть возвращается ли ожидаемое значение строчкой:
          ExpandedWrap disabled
            FindRes:=FindFirst(InBox+'*.*',faAnyFile,SR); //поиск

          Кроме того, в конец цикла в функциях ServiceExecute следует добавлять строчки
          ExpandedWrap disabled
            Sleep(100);
            ServiceThread.ProcessRequests(False );

          Иначе процесс может перестать отвечать на запросы и выпасть с ошибками. Это связано с тем, что сервисы должны отвечать на запросы системы вовремя, а для того, чтобы они отвечали требуется время и обработка сообщений системы.
          Сообщение отредактировано: simsergey -
            Цитата simsergey @

            Спасибо.
            Как раз, экспериментальным путем пришел к этому ответу. Отладка сервиса велась в виртуальной машине и для удобства в ней был смонтирован диск со структурой папок из основной системы, что бы удобнее было подкладывать данные для проверки. В этом случае, на смонтированную область файловой структуры, права предоставляются с разграничением (т.е. не полностью). При проверке на локальной файловой структуре виртуальной машины, все работает.

            Спасибо за подсказку про способность сервиса отвечать SCM. С тонкостями использования этой процедуры еще предстоит разобраться.
              n1056,

              M
              Используем тег [code] для добавления текста программы в пост! Устное предупреждение! Читаем правила!
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0293 ]   [ 17 queries used ]   [ Generated: 24.04.24, 19:09 GMT ]