Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Вниз

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

 
Фагот   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.036 c
4-1089194511
andrey__
2004-07-07 14:01
2004.08.15
Сообщения (Диалог между двумя приложениями).


14-1091069425
Думкин
2004-07-29 06:50
2004.08.15
С днем рождения! 29 июля


3-1090315249
Kaginava
2004-07-20 13:20
2004.08.15
работа с MySQL


1-1091044481
CrossOut
2004-07-28 23:54
2004.08.15
Преобразование String в tObject. Возможно ли это?


1-1091395450
sdw_syscoder
2004-08-02 01:24
2004.08.15
Потоки (Thread)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский