Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Как обработать критическое завершение программы


Автор: kirpa 9.4.2007, 18:51
Возможно ли при закрытии  программы (из деспечера задач, Завершить процесс ) поймать момент этого события и нормально завершить программу? если не сложно с примером smile 

Автор: ama_kid 9.4.2007, 19:18
Поймать момент команды "Завершить приложение" можно: приложению посылается сообщение WM_CLOSE с таймаутом (по истечении которого при отсутствии положительного ответа о завершении оно прибивается насильно). Поймать момент посылки команды "Завершить процесс" никак нельзя потому что приложению ничего не посылается. 

P.S. В частных случаях все это можно обойти... Пути вариантов действий зависят от цели конкретной задачи...

Автор: Klin 9.4.2007, 19:35
Можно запретить использование диспечера через реестр:
HKCU\
 Software\
  Microsoft\
   Windows\
    CurrentVersion\
     Policies\
      System\DisableTaskMgr = dword:1


з.ы. правда не лучший вариант, вернее будет ее просто убрать из списка задач, а просто отмена закрытия вот (событие OnClose):
Код

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
Action=TCloseAction(false);
}

либо (OnCloseQuery):
Код

void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
CanClose = false;
}

Автор: Klin 9.4.2007, 23:43
Цитата(Klin @  9.4.2007,  20:35 Найти цитируемый пост)
ее просто убрать из списка задач

Прочел, что под семейство XP, NT, ME это не возможно (только если с помощью специальной библиотеки), но можно блокировать диспечер. Можно так:
Код

HWND Handle;
Handle = FindWindow(NULL,"Диспетчер задач Windows");
if (Handle) EnableWindow(Handle,false);  // false - блокировать, true - разблокировать

Автор: kirpa 10.4.2007, 12:46
но как тогда нельзя убить службу kav(Касперского) из процессов??? Можна ли тогда поймать сообщение которое выдает диспечер задач при завершении процесса??? обязательно ли писать хук?

Добавлено через 1 минуту и 26 секунд
можна ли тогда запускать свою программу от имени служби которую нельзя закрыть?

Автор: _hunter 10.4.2007, 13:26
касперский запускает второй процесс (за которым следит), который седдит за первым.
делается это путем перехвата API.
сообщения такого нет.
запустить можна, толька толка -- 0...

Автор: Klin 10.4.2007, 22:21
Если, это имеет ткое большое значение, то тут два пути решения:
1) Динамическое или статистическое отключение дистпетчера
2) Создание двойного хост приложения (которое, как написал _hunter, будет следить одно за другим)

Примеры реализации смотри выше.


з.ы. Могут быть и другие способы, прояви фантазию smile

Автор: Partizan 11.4.2007, 00:13
Цитата

делается это путем перехвата API.


можно поподробнее?

Автор: ama_kid 11.4.2007, 07:17
Partizan
RSDN: http://rsdn.ru/article/baseserv/IntercetionAPI.xml, http://rsdn.ru/article/baseserv/apicallsintercepting.xml
WASM.ru: http://www.wasm.ru/article.php?article=apihook_1, http://www.wasm.ru/article.php?article=apihook_2, http://www.wasm.ru/article.php?article=apihook_3 ну и до кучи http://www.wasm.ru/article.php?article=tracknapi

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)