Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  00:19[Войти] | [Зарегистрироваться]
Ответ на вопрос № 55674

28-09-2007 02:37
Здравствуйте!
Проблема такая: написал свой сервис, все работает замечательно,
но при запущенном сервисе Windows не может завершить работу.

Подскажите пожалуйста как отловить завершение работы Windows и
как остановить самого себя??

Заранее благодарен за ответы.

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

23-10-2007 15:58
Но все же интересно, как в сервисе который не создает никаких окон
А вы уверены что никаких? Я вот например вижу в вашем mSimpleTCP2 функцию AllocateHWnd и даже попытку обработать WM_QUERYENDSESSION.

23-10-2007 06:01 | Сообщение от автора вопроса
Очень интересна дискуссия развернулась :)

В программе присутствует следующий компонент...
http://www.torry.net/vcl/internet/sockets/msimpletcp2.zip
Использую его для создания приложения типа клиент-сервер.

Вся проблема заключается в нем, т.к. если использовать вместо него этот:"IdTCPClient" и "IdTCPServer", то проблема решается :(

... Но все же интересно, как в сервисе который не создает никаких окон, поймать сообщение WM_QUERYENDSESSION.

Пробовал переписать unit SvcMgr, но пока безуспешно. Буду копать дальше, а вдруг что найду ))



22-10-2007 02:17 | Комментарий к предыдущим ответам
Да, здесь вы правы, видимо это действительно будет бесполезно, если только не нужна какая то спецобработка этого события. Кстати, на форме то обработчик WM_QUERYENDSESSION есть, и он обращается к FormCloseQuery. Вобщем, что то мы несколько уклонились от темы вопроса... Хотя другие проблемы, связанные с незавершением работы системы мне тоже не известны.

21-10-2007 06:08 | Комментарий к предыдущим ответам
Для наследников TWinControl имеет смысл первый код
Нет не имеет, потому как оконная процедура по умолчанию и так вернёт единицу. Хуже от вашего кода конечно не будет, но к чему лишние телодвижения? Вообще это классический пример "шаманства"... вопросы про WM_QUERYENDSESSION возникают постоянно и наиболее частый ответ "пишите обработчик, возвращайте единицу", при этом почему-то забывают, что WM_QUERYENDSESSION посылается всем toplevel окнам, но обработчик почему-то надо сделать именно на форме, хотя проблема на самом деле связана с неправильным написанием WndProc при использовании AllocateHWnd (или любом другом способе создания не VCL окна). И кстати говоря это может быть не единственной (хотя других я честно говоря не знаю) проблемой, если глотать необрабатываемые сообщения в WndProc.
PS: Я не проверял, но помоему дочерним окнам WM_QUERYENDSESSION не посылается, так что создание обработчика "В компоненте (с имеющейся оконной процедурой)", совсем уж странно: он просто никогда не будет вызван.

20-10-2007 20:26 | Комментарий к предыдущим ответам
Какой именно код не имеет смысла? Для наследников TWinControl имеет смысл первый код, для AllocateHWnd - второй.

20-10-2007 07:35
После таких действий компонент не будет препятствовать завершению работы приложения (сервиса).
Всё таки более правильно вызывать DefWindowProc для всех необработанных сообщений, что собственно и делается в TWinControl.DefaultHandler, так что для наследников TWinControl ваш код смысла не имеет, это актуально только для окон созданных с помощью AllocateHWnd.

19-10-2007 19:17
В компоненте (с имеющейся оконной процедурой) можно обработать это сообщение добавив такой метод:


uses
  ..., Messages, ...;

type
  TSomeComponent = class(TWinControl)
    ...
    procedure WMQueryEndSession(var Mesaga: TWMQueryEndSession); message
WM_QUERYENDSESSION;
    ...
  end;
...
procedure TSomeComponent.WMQueryEndSession(var Mesaga: TWMQueryEndSession);
begin
  Message.Result := 1;
end;


или непосредственно в оконной процедуре:


uses
  ..., Messages, ...;

type
  TSomeComponent = class(TWinControl)
    ...
    procedure WndProc(var Mesaga: TMessage); // оконная процедура
    ...
  end;

procedure TSomeComponent.WndProc(var Mesaga: TMessage);
begin
  ...
  case (Mesaga.Msg) of
    ...
    WM_QUERYENDSESSION: begin
      Mesaga.Result := 1;
    end;
    ...
  end;
  ...
end;


После таких действий компонент не будет препятствовать завершению работы приложения (сервиса).

19-10-2007 08:14
В принципе Kisius прав, если сервис интерактивный и создаёт какую нибудь "иконку в трее" (что типично для таких сервисов), то неправильная обработка WM_QUERYENDSESSION (это беда многих "иконок в трее") может быть причиной проблемы.

19-10-2007 02:29
To Kisius
Нет сервисы могут быть и без окна, поэтому у них есть свои уведомления. А то что код в OnShutdown не рабочий и так ясно.

18-10-2007 11:20
Как я понимаю сервис интерактивный... т.е. взаимодейтсвует с рабочим столом. Когда Windows завершает работу, она посылает окнам сообщение WM_QUERYENDSESSION. Скорее всего проблема в том, что какая то форма, например, или компонент на форме не дают остановить сервис из-за того, что не обрабатывают это сообщение или при обработке возвращают отрицательный результат. Например, на форме в обработчике FormCloseQuery в момент опроса параметр CanClose может быть выставлен в False.

28-09-2007 05:49
да, событие OnShutdown я создал...

28-09-2007 03:26
А вы создали событие OnShutdown? Вобщето оно в глаза бросается. Да и OnStop OnStart тамже задается.

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Жили у бабуси два веселых гуся. Один белый, другой КАКОЙ?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования