IPB
ЛогинПароль:

 
 Ответить  Открыть новую тему 
> Программа мешает перезагрузиться
сообщение
Сообщение #1


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Привет всем.

Сомневался между разделом Delphi и этим, запостил сюда. Есть программа на делфи, обычное такое VCL-приложение, не служба, никаких хуков, немного API (типа FindWindow, GetForeignWindow). И вот столкнулся с проблемой, что когда эта программа работает, то компьютер не получается перезагрузить или выключить (через Пуск - Выключить компьютер...). Все остальные приложения, работающие в тот момент, порядочно закрывается, а это висит, и перезагрузки/выключения не происходит. Без этого приложения всё нормально перезагружается. В журнале событий такое предупреждение (с жёлтым значком): "Попытка Перезагрузка HOME-********** не удалась". На данный момент кода с собой нет. Что это может быть?


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


есть такая фишка. Немного кода, и приложение нельзя закрыть никак. В какой-то книжке видел.
Возможно это, а может и что-нибудь другое
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Выпросил у человека код и увидел на событии формы OnCloseQuery строчку canclose:=false;. Всё ясно. Клиент, навёл на мысль smile.gif


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
Всё ясно
Вот к чему приводят шаблоны... smile.gif Чего тебе ясно?

Цитата
Очень часто мы сталкиваемся с проблемой, когда наша программа будучи запущенная в фоне и/или свёрнутая, например, в панель задач должна что-то сделать, когда Windows выключается, перезагружается или просто меняется пользователь.
Если мы не будем отслеживать такую ситуацию, то в худшем случае у нас могут просто потеряться какие-либо данные или Windows просто не сможет выполнить перезагрузку до конца. Ей будет мешать наша программа. Не нужно думать, что Windows перед перезагрузкой рассылает приложениям сообщения о закрытии, так чтобы у тех выполнились обработчики TForm.onCloseQuery/onClose. ОС Windows отсылает перед перезагрузкой, выключением или сменой пользователя сообщения WM_QUERYENDSESSION, а потом по его успешному завершению WM_ENDSESSION. Наше приложение должно поймать эти сообщения и отреагировать так чтобы дать понять, что мы согласны перезагружаться. В частности на сообщение WM_QUERYENDSESSION мы должны вернуть не 0
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


ни form1.canclose ни Application.canclose свойств не нашел. Где оно?
Цитата
Вот к чему приводят шаблоны... Чего тебе ясно?
а можно узнать, что за шаблоны?
Цитата
В частности на сообщение WM_QUERYENDSESSION мы должны вернуть не 0
И как быть тогда? Переделать оконную процедуру, и там отлавливать сообщение, сделать что надо и вернуть 0?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Volvo, интересно...
Цитата
В частности на сообщение WM_QUERYENDSESSION мы должны вернуть не 0


Так получается, что по умолчанию и возвращается Не 0, раз программы закрываются. А эта - не закрывается, потому что на событии OnCloseQuery (Client, на событии) висит такой обработчик. Буду отлавливать WM_QUERYENDSESSION, так как тот обработчик видимо нужен зачем-то.. smile.gif

Цитата
а можно узнать, что за шаблоны?


Шаблоны в моей голове относительно того, как запретить закрытие приложения smile.gif

Сообщение отредактировано: Unconnected -


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Не только в твоей голове, кстати. Это очень распространенное заблуждение. Читайте MSDN внимательнее, таких заблуждений будет меньше smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Может, кому-то пригодится, сделал так:

procedure WMQUERYENDSESSION(var Msg: TMessage);message WM_QUERYENDSESSION;
...
procedure TForm1.WMQUERYENDSESSION(var Msg: TMessage);
begin
halt;
inherited;
end;


Тут не возвращается значение, просто программа закрывается, результат тот же в принципе.


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Я сейчас тебя поцарапаю... Опять нестандартные действия? Кто мешает:
procedure TForm1.FormCreate(Sender: TObject);
begin
WindowCanBeClosed := False; // Переменная описана в классе формы
end;

procedure TForm1.WMQueryEndSession(var Message:
TWMQUERYENDSESSION);
begin
WindowCanBeClosed := True;
Inherited;
end;

procedure TForm1.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
CanClose := WindowCanBeClosed;
end;

?

Не надо принудительно завершать программу. Ибо результат - совсем не тот, как при нормальном завершении - деструкторы форм не отрабатывают, а если у тебя там какие-то логи пишутся?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


procedure TForm1.WMQUERYENDSESSION(var Msg: TMessage);
begin
halt;
inherited; // Разве выполнится?
end;
А разве после halt оператор выполнится? Это же как exit - выход из процедуры
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Цитата
Кто мешает:


Здорово, и правда ведь, FormCloseQuery сработает после прихода сообщения.. Спасибо:)
Цитата

А разве после halt оператор выполнится?


Не выполнится, я убрать забыл просто..


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 25.04.2024 15:27
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name