Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ Блокировка Ctrl+break - снятия задачи в ДОС

Автор: Altair 28.09.2004 12:02

Нужен резидент, блокирующий нажатие CTRL+Break.
Что происходит при нажатии этих клавиш?
Осуществить блокировку требуется программно, т.к. соответствующая команда ДОС не работает!

Автор: APAL 28.09.2004 14:02

Вроде была какая-то переменная окружения в ДОСе.
А что, разве в TP не работает SetCBreak(False) и checkbreak:=false ?

Автор: GoodWind 28.09.2004 20:23

Цитата
Вроде была какая-то переменная окружения в ДОСе

break=off вроде ;)

Автор: Altair 1.10.2004 15:56

Цитата
break=off вроде

Если бы было так просто, я бы не спрашивал. :P
SetCBreak(False); не работает!, потому что он устанавливает переменную окружения ДОС в нужное значение. Но в ДОСе почему -то не работает эта функция (во всяком случае у меня, значит и еще у кого-то)
checkbreak:=false; устанавливая так переменную, модуль CRT хранит вектор прерывания и обрабатывает нажатие CTRL+BREAK на уровне прерываний.
Вот почему работает checkbreak:=false и НЕ работает SetCBreak(False);

А почему переменная окружения ДОС не исполняет своих обязанностей?

Автор: SKVOZNJAK 1.10.2004 17:39

Попробуй ту же прогу протестить в реальном досе, может винда не даёт тебе выполнить эту операцию.

Автор: Altair 1.10.2004 18:02

Пробовал!
Нет, не работает дос переменная окружения!

Автор: GoodWind 2.10.2004 1:26

Цитата
Нет, не работает дос переменная окружения!

интересный, извините за выражение, гемморой .... тоже займусь, из спортивного интереса, блокировкой Ctrl+break

Автор: Nebel 2.10.2004 10:21

Виновата имеено винда

Автор: Altair 2.10.2004 10:22

А вот за я зык тебя никто не тянул. smile.gif
Будешь мне помогать ... smile.gif
Вот прога:

Код

uses DOS,CRT;
var
i:byte;

begin
{SetCBreak(False);} {*}
checkbreak:=false;  {**}
i:=1;
writeln('START, vvedite parol:');
readln(i);
end.


По очереди будешь раскоментировать строки * и ** , скажешь какая работает а какая нет! :D

Автор: GoodWind 2.10.2004 21:43

Цитата
Будешь мне помогать ...

да пжалста...

----

извиняюсь за задержку Вынь переставлял ;)

-----

вобщем: с раскоментированной (!) все работает (ноль реакции на нажатие ctrl+break ), но не в пасовском отладчике, а при запуске проги из под коммандной строки.

я так понял, что пасовский дебагер следит за нажатием Ctrl+break ( и ctrl+c тоже) на случай криво написанной проги, т.е. проверка нажатия не встраивается в код при компиляции, а осуществляется им.

в данных условиях, раскоментировать вторую строку я не стал


фуф...

Автор: Altair 2.10.2004 22:20

ну значит мои размышления верны. Я счастлив!

Автор: GoodWind 2.10.2004 22:25

Рад помочь,

Цитата
помогая друг другу, мы справимся с любыми трудностями!


[offtop]
Олег, у тебя юбилейное, 900 сообщение :p10:
[/offtop]

Автор: godd 3.10.2004 3:08

checkbreak:=false;
и усе. при его примениении SetCBreak(False) уже не обязательно, и библиотеку DOS мона не подключать, а обойтись тока CRT )

Автор: Altair 3.10.2004 12:05

godd, если бы Вы внимательно прочти сказанное выше, Вы бы не оставили здесь свой неудачный пост.

Цитата
Виновата имеено винда

аналогично! angry.gif

Автор: godd 3.10.2004 13:13

у меня и под Виндой блокируется (ME).

Автор: GoodWind 3.10.2004 19:58

Цитата
у меня и под Виндой блокируется (ME).

надо-же blink.gif

Автор: Guest 3.10.2004 22:54

я серьезно говорю. Винда - MilleniumEdition, Ctrl+Break - блокируется через checkbreak:=false модуля CRT (в help'e написано что он и под виндами пашет, и отключает не тока Ctrl+Break но и Alt+F4 и еще чо-то - кому интересно в справке), просто Break - останавливает прогу до нажатия клавиши

Автор: godd 3.10.2004 22:56

пред пост я написал.

Автор: Altair 5.10.2004 16:26

Цитата
я серьезно говорю. Винда - MilleniumEdition, Ctrl+Break - блокируется через checkbreak:=false модуля CRT (в help'e написано что он и под виндами пашет, и отключает не тока Ctrl+Break но и Alt+F4 и еще чо-то - кому интересно в справке), просто Break - останавливает прогу до нажатия клавиши

Это всем известно smile.gif
Цитата
просто Break - останавливает

Ничего он не останавливает!
Это останавливает клавиша PAUSE, просто они 2 клавиши сидят физически на одной, но при нажатии PAUSE и PAUSE (break) и еще какой-нибудь вырабатываютсяразные скан-коды. !

Автор: godd 5.10.2004 20:00

Oleg_Z
я имел ввиду паузу.

Автор: BlackShadow 8.10.2004 1:50

Не стал дочитывать до конца - влом как-то. Есть такой Int интересный, который вызывается как реакция на Ctrl+Break. Вроде 24h. Его адрес ещё в PSP прописывается. Можно было бы его перехватить... Хотя, что на это скажет винда - не знаю.

Автор: Altair 8.10.2004 1:54

Ага, спасибо BlackShadow, именно мне это и надо!
перхват прерывания самое надежное дело!

Автор: godd 8.10.2004 1:55

BlackShadow
а ты почитай, там вывод: checkbreak из модуля crt решает данную задачу

Автор: godd 8.10.2004 1:55

Oleg_Z
дело хозяйское

Автор: Altair 8.10.2004 2:03

Дело в том, что из модуля то решает но инстерсно как там все работает!

Автор: godd 8.10.2004 2:20

Oleg_Z
понятно. просто я на ассме не разбираюсь, и не до конца понимаю, где он может пригодиться (ну мелкие там функции для прог - это и я, если поднапрячся и сильно надо будет смогу, а по-крупному?)

Автор: BlackShadow 19.10.2004 2:26

godd, тогда и не пытайся учить старших smile.gif
CheckBreak определяет набор функций DOS'а, которые используются при вводе выводе самим модулем. А вот Oleg_Z, может относит себя к тем, что не станет рисковать Runtime Error'ом 200 из-за какого-то CheckBreak'а.

Автор: godd 19.10.2004 3:55

BlackShadow
я и не пытаюсь ;)
мне просто интересно )

Автор: xds 19.10.2004 6:26

Прерывание Int 23h активизируется из системных вызовов DOS, проверяющих буфер клавиатуры (в основном функции консольного ввода-вывода), и возникает при обнаружении в буфере сочетания Ctrl-C. При нажатии Ctrl-Break происходит более сложная комбинация: контроллер клавиатуры -> IRQ1 <=> Int 9 -> Int 1Bh - обработчик Ctrl-Break BIOS'а, по умолчанию вставляет Ctrl-C в буфер клавиатуры.

Вектор Int 23h не требует восстановления перед выходом из программы: после завершения программы DOS сама присваивает стандартные значения векторам Int 22h, 23h, 24h.