| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Как обработать критическое завершение программы |
| Автор: kirpa 9.4.2007, 18:51 |
| Возможно ли при закрытии программы (из деспечера задач, Завершить процесс ) поймать момент этого события и нормально завершить программу? если не сложно с примером |
| Автор: 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):
либо (OnCloseQuery):
|
| Автор: Klin 9.4.2007, 23:43 | ||
Прочел, что под семейство XP, NT, ME это не возможно (только если с помощью специальной библиотеки), но можно блокировать диспечер. Можно так:
|
| Автор: 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, будет следить одно за другим) Примеры реализации смотри выше. з.ы. Могут быть и другие способы, прояви фантазию |
| Автор: Partizan 11.4.2007, 00:13 | ||
можно поподробнее? |
| Автор: 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 |