Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.15;
Скачать: CL | DM;

Вниз

Завершение программы   Найти похожие ветки 

 
Фагот   (2004-07-30 15:01) [0]

Здравствуйте!
Не бейте кирпичом по голове. Мне необходимо, чтобы при завершении работы Windows моя консольная программа тоже завершала работу и окно с принудительным завершением не выходило..


 
GrayFace   (2004-07-30 15:27) [1]

Можно создать окно, а когда ему шлют WM_close, завершать прогу.


 
olookin ©   (2004-07-30 15:30) [2]

Не вижу разницы между консольным приложением и обычным окном. Поэтому отловить WM_QUERYENDSESSION и потом сделать что требуется.


 
Юрий Зотов ©   (2004-07-30 17:04) [3]

> olookin ©   (30.07.04 15:30) [2]

> Не вижу разницы между консольным приложением и обычным окном.

А она есть. Точнее, может быть, а может и не быть - смотря как написать программу.

> Поэтому отловить WM_QUERYENDSESSION и потом сделать что
> требуется.

Вот-вот. А что значит - "отловить"? Это значит - написать код, срабатывающий при приходе WM_QUERYENDSESSION. А как этот код сработает - сам по себе, что ли? Нет, его кто-то вызвать должен. Вот и вопрос - а кто?

И получается, что программа должна содержать цикл выборки сообщений и процедуру их обработки. Которые в обычной консольной программе не нужны - вот и отличие.


 
olookin ©   (2004-07-30 18:18) [4]

Фагот   (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 18:21) [5]

>olookin ©   (30.07.04 18:18) [4]

То же самое хотел написать ;))


 
Zelius ©   (2004-07-30 19:07) [6]


> Но сам так и не понял, как это заставить работать. Именно,
> не пойму, как передать в параметр Ctrl_handler нужное сообщение.
> Надеюсь, у тебя получится .

Это не ты должен туда передавать параметр, а винда передаст, а тебе надо только правильно его отработать.


 
Юрий Зотов ©   (2004-07-30 19:13) [7]

> не пойму, как передать в параметр 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.


 
olookin ©   (2004-07-30 20:37) [8]

Юрий Зотов ©   (30.07.04 19:13) [7]

Значит, если я правильно понял, в примере ошибка?

Т.е.
"А где-то в программе:
 SetConsoleCtrlHandler(Ctrl_Handler, TRUE );"

должно было выглядеть как

"А где-то в программе:
 SetConsoleCtrlHandler(@Ctrl_Handler, TRUE );"

Так?


 
Юрий Зотов ©   (2004-07-30 20:47) [9]

> olookin ©   (30.07.04 20:37) [8]

Если не написать @, то компилятор может выдать сообщение об ошибке. А суть одна и та же.


 
olookin ©   (2004-07-30 20:50) [10]

Юрий Зотов ©   (30.07.04 20:47) [9]

Вот именно что выдавал ошибку.



Страницы: 1 вся ветка

Текущий архив: 2004.08.15;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.058 c
14-1091033833
Art_Z
2004-07-28 20:57
2004.08.15
Хочу книгу по железу!


1-1091010419
Марковка
2004-07-28 14:26
2004.08.15
Treeview


3-1090389255
leonidus
2004-07-21 09:54
2004.08.15
Вопрос по связи таблиц с последующим добавлением записей в подчин


3-1090225525
AlexanderSK
2004-07-19 12:25
2004.08.15
Как работает IBQuery?


3-1089954838
Hereticsoul
2004-07-16 09:13
2004.08.15
список таблиц в mysql