Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.022 c
8-1085611549
Net
2004-05-27 02:45
2004.08.15
Видио или не видио???


14-1090898346
Hooch
2004-07-27 07:19
2004.08.15
delphiplus.org


6-1087452695
anton.
2004-06-17 10:11
2004.08.15
Как создать TCPServer в Runtime?


3-1090386222
Sergey Vorobyev
2004-07-21 09:03
2004.08.15
Сравните MySQL и Interbase, хотя бы по одной фразе


10-1029238605
aserov
2002-08-13 15:36
2004.08.15
Как сервер автоматизации обрабатывать массив структур




   Наверх