![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Завершение программы
Фагот © (2004-07-30 15:01:00)Здравствуйте!
Не бейте кирпичом по голове. Мне необходимо, чтобы при завершении работы Windows моя консольная программа тоже завершала работу и окно с принудительным завершением не выходило..
olookin (2004-07-30 20:50:00) [1]Юрий Зотов © (30.07.04 20:47) [9]
Вот именно что выдавал ошибку.
Юрий Зотов (2004-07-30 20:47:00) [2]> olookin © (30.07.04 20:37) [8]
Если не написать @, то компилятор может выдать сообщение об ошибке. А суть одна и та же.
olookin (2004-07-30 20:37:00) [3]Юрий Зотов © (30.07.04 19:13) [7]
Значит, если я правильно понял, в примере ошибка?
Т.е.
"А где-то в программе:
SetConsoleCtrlHandler(Ctrl_Handler, TRUE );"
должно было выглядеть как
"А где-то в программе:
SetConsoleCtrlHandler(@Ctrl_Handler, TRUE );"
Так?
Юрий Зотов (2004-07-30 19:13:00) [4]> не пойму, как передать в параметр Ctrl_handler нужное
> сообщение.
Это не сообщение. Это адрес нашей callback-функции, которую система вызовет САМА и передаст ей информацию о причине вызова. См. HandlerRoutine в справке API.
program Project1;
{$APPTYPE CONSOLE}
uses
Windows, SysUtils;
var
ExitFlag: boolean = False;
function CtrlHandler(Reason: DWORD): BOOL; stdcall;
begin
Result := True; // Не вызывать стандартный обработчик
ExitFlag := True;
end;
begin { main }
Win32Check(SetConsoleCtrlHandler(@CtrlHandler, True));
while not ExitFlag do
begin
...
end
end.
Zelius (2004-07-30 19:07:00) [5]
> Но сам так и не понял, как это заставить работать. Именно,
> не пойму, как передать в параметр Ctrl_handler нужное сообщение.
> Надеюсь, у тебя получится .
Это не ты должен туда передавать параметр, а винда передаст, а тебе надо только правильно его отработать.
Кириешки (2004-07-30 18:21:00) [6]>olookin © (30.07.04 18:18) [4]
То же самое хотел написать ;))
olookin (2004-07-30 18:18:00) [7]Фагот (30.07.04 15:01)
Я нашел некий пример:
Все процессы получают сигналы CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT и CTRL_SHUTDOWN_EVENT. А делается это (грубо говоря :) так:
BOOL Ctrl_Handler( DWORD Ctrl )
{
if( (Ctrl == CTRL_SHUTDOWN_EVENT)
|| (Ctrl == CTRL_LOGOFF_EVENT)
)
{
// Вау! Юзер обламывает!
}
else
{
// Тут что-от другое можно творить. А можно и не творить :-)
}
return TRUE;
}
===
function Ctrl_Handler(Ctrl: Longint): LongBool;
begin
if Ctrl in [CTRL_SHUTDOWN_EVENT, CTRL_LOGOFF_EVENT] then
begin
// Вау, вау
end
else
begin
// Am I creator?
end;
Result := true;
end;
===
А где-то в программе:
SetConsoleCtrlHandler( Ctrl_Handler, TRUE );
Таких обработчиков можно навесить кучу. Если при обработке какого-то из
сообщений обработчик возвращет FALSE, то вызывается следующий обработчик. Можно насторить таких этажерок, что ого-го :-)))
Короче, смотри описание SetConsoleCtrlHandler -- там всё есть.
Но сам так и не понял, как это заставить работать. Именно, не пойму, как передать в параметр Ctrl_handler нужное сообщение. Надеюсь, у тебя получится .
Юрий Зотов (2004-07-30 17:04:00) [8]> olookin © (30.07.04 15:30) [2]
> Не вижу разницы между консольным приложением и обычным окном.
А она есть. Точнее, может быть, а может и не быть - смотря как написать программу.
> Поэтому отловить WM_QUERYENDSESSION и потом сделать что
> требуется.
Вот-вот. А что значит - "отловить"? Это значит - написать код, срабатывающий при приходе WM_QUERYENDSESSION. А как этот код сработает - сам по себе, что ли? Нет, его кто-то вызвать должен. Вот и вопрос - а кто?
И получается, что программа должна содержать цикл выборки сообщений и процедуру их обработки. Которые в обычной консольной программе не нужны - вот и отличие.
olookin (2004-07-30 15:30:00) [9]Не вижу разницы между консольным приложением и обычным окном. Поэтому отловить WM_QUERYENDSESSION и потом сделать что требуется.
GrayFace (2004-07-30 15:27:00) [10]Можно создать окно, а когда ему шлют WM_close, завершать прогу.