Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.02.2011, 21:10   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию Server2008(x64) не может закрыть моё приложение при завершении работы системы, но убивается через ДЗ

Всем доброго времени суток!

Собственно такая проблема:
Обратился юзер с проблемойю У него стоит Windows Server 2008 r2 , стоит моя программа.
Как только он(юзер) пытается завершить работу системы(выключение пк, перезагрузка оного) то, система не перезагружается(выключается) т.к. не может закрыть мою программу. Все другие проги успешно закрываются. Мою приходится убивать принудительно(как через дисп. задачь).

На Windows 7,Windows server 2003,Windows XP таких проблем нет.


В чём может быть прчина и как это исправить?

Пака решение, это убивать программу принудительно через планировщик задачь. Но это не выход.

Последний раз редактировалось Человек_Борща; 28.02.2011 в 21:14.
Человек_Борща вне форума Ответить с цитированием
Старый 01.03.2011, 05:33   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Небось в OnCloseQuery() возвращаешь canClose = false всегда, чтобы из трея не выбило. А надо возвращать true, если перед этим словил WM_QUERYENDSESSION.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 01.03.2011, 18:08   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

А можно пример с WM_QUERYENDSESSION? У меня в CloseCquerty код проверки "сворачивания в трей":
Код:
procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
  i: Integer;
begin
  CanClose := False;
  //Если не включано "Сворачивание при закрытии" то
  if not TrayIco.CloseToTray then
  begin
    for i := Applist.Count - 1 downto 0 do
    begin
      //если помечего прибить задачу при выходе из программы
      if AppList.GetAppData[i].AppInfo.CloseAppWhenHLRClosing_flag then
      begin
        //и задача активна
        if AppList.GetAppData[i].AppInfo.ActiveTask then
        begin
          //Прибиваем
          AppList.StopOne(i);
        end;
      end;
    end;
    //Можно свалить...
    CanClose := True;
  end
  else
  begin
    //нельзя свалить..
    CanClose := False;
  end;
end.
это белалось для того чтобы работало так-же как и крестик, иначе приходилось вызывать Terminate(что не желательно).
Человек_Борща вне форума Ответить с цитированием
Старый 01.03.2011, 18:46   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Код:
  TForm1 = class(TForm)
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    { Private declarations }
    f_endSession: boolean;
  public
    { Public declarations }
    procedure QES(var msg: TMessage); message WM_QUERYENDSESSION;
  end;


procedure TForm1.QES(var msg: TMessage);
begin
  f_endSession := true;
  //
  inherited; // !
end;


procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if (not f_endSession) then begin
    //
    // тут весь тот кошмарный код из FormCloseQuery(), приведенный вами выше
    //
  end
  else
    canClose := true; // not actually needed, but looks nice
end;
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 01.03.2011, 23:38   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Благодарен, поставил +.

Маленький вопрос:
Как происходит выходит из программы?
Я предположил это так:
WM_QUERYENDSESSION => Рассылка WM_QUIT всем процессам по очереди => Программа получает сообщение => CloseQuerty => Close

Это правильно?
Человек_Борща вне форума Ответить с цитированием
Старый 02.03.2011, 08:53   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

WM_QUERYENDSESSION высылается только в трех случаях (определяется флагом в lParam):

1) ENDSESSION_CLOSEAPP - когда система решила, что приложение используется какой-то ресурс, который должен быть изменен (файл) или заканчивается (память).

2) ENDSESSION_LOGOFF - когда юзер делает логофф (ну или shutdown, там все-равно сначала логофф).

3) ENDSESSION_CRITICAL - когда произошло нечто ужасное )

Причем, все эти случаи не взаимоисключающие )

При обработке WM_QUERYENDSESSION мы как можно быстрее возвращаем True, если готовы к закрытию, или False, если не готовы (не рекомендуется). Для этого там вызывается inherited, чтобы стандартный обработчик вернул True.

Если вернули True, то чуть позже получим WM_ENDSESSION, вот тут можно спокойно, не спеша сохранять файлы и выполнять прочую подготовку к закрытию.

Если за 5 секунд не ответилии, то высвечивается диалог "Эта программа не отвечает.."

При обычном закрытии приложения никаких ENDSESSION не высылается. Собсвенно, так мы и понимаем разницу между тем, что юзер нажал крестик (и мы должны тихо уйти в трей) и между завершением работы системы (когда мы тоже должны завершить работу).
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 02.03.2011, 17:20   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Примного благодарен, жаль ещё плюсов нельзя поставить=)
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запуск exe/dll при завершении работы windows 7 AdoL Windows 1 24.12.2010 10:21
Как закрыть приложение при выключение Winsows pro100-delphi Общие вопросы Delphi 12 10.09.2009 16:12
создание dll при старте приложения и удаление при завершении TyoshA Общие вопросы Delphi 7 13.07.2009 13:56
приложение без формы, событие при завершении ERASERROR Общие вопросы Delphi 10 22.02.2008 14:10
как поставить иконку в моё приложение? steck Паскаль, Turbo Pascal, PascalABC.NET 2 16.05.2007 18:12