Ребята, не в курсе шлёт ли OC какое-нить сообщение программе, перед тем как её аварийно закрыть, т.е. пользователь завершает задачу в "Диспетчере программ"?
Спасибо.
Здравствуйте Mith, Вы писали:
M> Ребята, не в курсе шлёт ли OC какое-нить сообщение программе, перед тем как её аварийно закрыть, т.е. пользователь завершает задачу в "Диспетчере программ"? M> Спасибо.
Сначала ОС пытается закрыть программу "по хорошему", то есть шлет ей WM_CLOSE. Ну а потом уже и
Здравствуйте Flamer, Вы писали:
F>Здравствуйте Mith, Вы писали:
M>> Ребята, не в курсе шлёт ли OC какое-нить сообщение программе, перед тем как её аварийно закрыть, т.е. пользователь завершает задачу в "Диспетчере программ"? M>> Спасибо.
F>Сначала ОС пытается закрыть программу "по хорошему", то есть шлет ей WM_CLOSE. Ну а потом уже и
Ты хочешь сказать, что когда мы выбираем EndTask процессу посылается сообщение WM_CLOSE? Сообщения могут посылаться только окнам или потокам. Всем потокам посылать WM_CLOSE точно никто не будет, а если процесс не имеет ни одного окна — тогда что?
Я думаю, TM без всяких предупреждений просто вызывает TerminateProcess и все.
Re[3]: Опять про Ctrl-Alt-Del...
От:
Аноним
Дата:
22.10.02 09:01
Оценка:
Здравствуйте Алекс, Вы писали:
А>Я думаю, TM без всяких предупреждений просто вызывает TerminateProcess и все.
Нет, сначала он пытается определить основное окно, и посылает ему WM_CLOSE, а вот уж если приложение не реагирует...
Здравствуйте Аноним, Вы писали:
А>Здравствуйте Алекс, Вы писали:
А>>Я думаю, TM без всяких предупреждений просто вызывает TerminateProcess и все.
А>Нет, сначала он пытается определить основное окно, и посылает ему WM_CLOSE, а вот уж если приложение не реагирует...
Здравствуйте Аноним, Вы писали:
А>Нет, сначала он пытается определить основное окно, и посылает ему WM_CLOSE, а вот уж если приложение не реагирует...
А может сначала стоило бы попытаться проверить это, а потом утверждать?
Хотя бы с помощью того же Spy++?
Вот отрывок из книги Inside Microsoft Windows 2000 / David A. Solomon, Mark Russinovich.
... on systems without Terminal Services, Task Manager uses the TerminateProcess
function to end processes. However, when you direct Task Manager to end a process
on a system running in a Terminal Services environment, Task Manager calls on
Termsrv.exe, the terminal services service, to perform the process termination.
Because Termsrv.exe is a service process running in the System account, it has the
debug privilege, which it uses to open a process it's terminating without regard to
the process's token or process security settings.
Console processes receive a separate notification message, CTRL_SHUTDOWN_EVENT or CTRL_LOGOFF_EVENT, as the situation warrants. A console process routes these messages to its HandlerRoutine function.
...
The system generates CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, and CTRL_SHUTDOWN_EVENT signals when the user closes the console, logs off, or shuts down the system so that the process has an opportunity to clean up before termination.
А обработчик устанавливается функцией SetConsoleCtrlHandler.
Так что все, по видимому, в наших руках.
А>Нет, сначала он пытается определить основное окно, и посылает ему WM_CLOSE, а вот уж если приложение не реагирует...
Да, ладно, будет Вам спорить!
Консольные приложения ещё какие-то... На то он и windows, что бы работать с окнами. Я ещё не попробовал, но начну с самого простого — WM_CLOSE, а потом уж как получиться.
А при чем здесь Task Manager? Он пользуется виндовыми функциями, пусть и native. Так что нотификации посылает виндовс. В MSDN про это прямо и сказано — почитайте. Кстати, я проверил таки в коде — посылает... так что этот метод для консольного приложения правильнее, нежели организация очереди сообщений (sic!).
Здравствуйте Mith, Вы писали:
M> Ребята, не в курсе шлёт ли OC какое-нить сообщение программе, перед тем как её аварийно закрыть, т.е. пользователь завершает задачу в "Диспетчере программ"? M> Спасибо.
Если завершается задача — ей шлют WM_CLOSE, а если она все не хочет завершиться — ее пристреливают
Если же завершается процесс — ему ничего не шлют, а просто говорятЪ TerminateProcess (по крайней мере ето так выглядит + иначе невозможно убить зависший процесс а процессы валятся все, кроме тех, которые сервисы
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Здравствуйте Andrew S, Вы писали:
AS>[i]Console processes receive a separate notification message, CTRL_SHUTDOWN_EVENT or CTRL_LOGOFF_EVENT, as the situation warrants.
Маленькое дополнение. Напомню, что под определение "операционная система" не подходят Win9x/Me.
Так что там никаких CTRL_SHUTDOWN_EVENT/CTRL_LOGOFF_EVENT не предусмотрено.