Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не могу остановить свой сервис [D6, WinXP]


Страницы:   1 2

novill ©   (2006-06-23 10:48:00) 

Написал сервис по описанию в хелпе.

При попытке остановить процесс Винда выдает ошибку: "не удалось остановить службу. Эта служба не возвращала код ошибки. Возможно это внутренняя ошибка Windows или службы."


После этого службу нельзя удалить (uninstall). Windows говорит что пометила ее на удаление, но до перезагрузки служба висит: ни запустить , ни остановить.

unit ServU;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
 DB, IBCustomDataSet, IBQuery, IBDatabase;

type
 TDS = class(TService)
   procedure ServiceExecute(Sender: TService);
 private
   { Private declarations }
 public
   function GetServiceController: TServiceController; override;
   { Public declarations }
 end;

var
 DS: TDS;

implementation

uses mainU;
{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
 DS.Controller(CtrlCode);
end;

function TDS.GetServiceController: TServiceController;
begin
 Result := ServiceController;
end;

procedure TDS.ServiceExecute(Sender: TService);

begin
    while not Self.Terminated do
     begin
      {мои процедуры}
     end;
end;

end


novill   (2006-06-23 13:48:00) [21]

При этом та же функция доступа из оконного приложения работает исправно.


novill   (2006-06-23 13:41:00) [22]

ESockError
Connection Failed


Сергей М.   (2006-06-23 12:48:00) [23]


> novill ©   (23.06.06 12:45) [12]


Ты на [8] отреагировал ?


novill   (2006-06-23 12:45:00) [24]

Тогда уже лучше перименовать "WinApi WinAPI" в "Система(Winapi)"


Игорь Шевченко   (2006-06-23 12:39:00) [25]


> И, кстати, причем здесь WinAPI ?


Если кто скажет, что проблемы с сервисами не относятся к тематике конференции "работа с системой", я перенесу ветку обратно в "основную"


novill   (2006-06-23 12:38:00) [26]


> Сергей М. ©   (23.06.06 12:09) [9]
> И, кстати, причем здесь WinAPI ?

Не знаю, я в основную писал, кто-то из админов перекинул


Сергей М.   (2006-06-23 12:09:00) [27]

И, кстати, причем здесь WinAPI ?


Сергей М.   (2006-06-23 12:01:00) [28]


> почему доступа к IB из сервиса может не быть?


Об этом тебе скажет код ошибки, возвращенный ф-цией, осуществляющей "доступ"


novill   (2006-06-23 11:52:00) [29]

Строчку добавил такую

      ServiceThread.ProcessRequests(False);

Может, вы знаете, почему доступа к IB из сервиса может не быть?


novill   (2006-06-23 11:50:00) [30]

спасибо

Добавил. Ошибка все равно иногда валится, но служба останавливается.


Сергей М.   (2006-06-23 11:39:00) [31]


> оказалось, что остановить невозможно сервис даже с таким
> телом.
>


Потому что вызов метода TServiceThread.ProcessRequests() у тебя напрочь отсутствует. А он ключевой во всей этой сервисной "кухне".


novill   (2006-06-23 11:36:00) [32]

Там творилось много чего. (Почтовый робот).
Но оказалось, что остановить невозможно сервис даже с таким телом.

procedure TDownloadService.ServiceExecute(Sender: TService);
var statfile:Text;
begin
  AssignFile(statfile,'event.log');
    while not Self.Terminated do
     begin
       Append(statfile);
       Writeln(statfile,DateTimeToStr(Now));
       Flush(statfile);
       SleepEx(5000,true);
     end;
  CloseFile(statfile);
end;


Сергей М.   (2006-06-23 11:18:00) [33]

Тогда показывай, что творится у тебя в

{мои процедуры}

Кстати, Self не нужен - Terminated является св-вом самого TService.


novill   (2006-06-23 11:03:00) [34]

Добавил:

procedure TDownloadService.ServiceStop(Sender: TService;
 var Stopped: Boolean);
begin
 Stopped:=true;
end;

Та же ошибка...


Сергей М.   (2006-06-23 10:56:00) [35]

Обрабатывай событие OnStop.
В этом обработчике обязательна строчка Stopped := True - тем самым ты подтверждаешь исполнение поданного тебе сервис-менеджером запроса на останов сервиса.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо