Почему нельзя редактировать.com (16 бит) в Windows XP или в Virtual PC в Windows 7, чтобы выйти, нажав кнопку закрытия?

342
Kevin Dong

Почему нельзя отредактировать edit.com (16-разрядный, также известный как MS-DOS Editor), нажав кнопку закрытия в Windows XP или в Virtual PC в Windows 7, но можно успешно завершить, нажав ФайлВыход ?

Снимок экрана (не на английском языке :-)):

Та же ошибка на английском:

Изображение на английском

0
Я бы сказал, что причина в том, что кнопка x закрывает оболочку, а не интерпретируемое время выполнения, которое выполняет 16-битные приложения. это похоже на запуск htop в терминале Linux, а затем закрытие окна. вы получите сообщение, что даже если оболочка закрыта, htop продолжит работу, и вы не сможете закрыть ее, потому что ваша оболочка для нее больше недоступна. Frank Thomas 10 лет назад 2
Потому что на самом базовом уровне вы должны включить близкое поведение. Если кнопка закрытия не закрывает приложение, значит, оно не было запрограммировано для этого. Ramhound 10 лет назад 0
VDM в Windows NT 5.1 и Virtual PC в Windows NT 6.1 - это две разные вещи. Это действительно должно быть два вопроса. JdeBP 10 лет назад 0
@JdeBP, они не отличаются. Виртуальная система, о которой он спрашивает, - это просто XP, работающая на ВМ в 7. Гостевая копия XP ведет себя так же в отношении NTVDM, как и на голом железе. Synetech 10 лет назад 1
`Почему edit.com (16-разрядный, также известный как MS-DOS Editor) не может быть успешно завершен нажатием кнопки закрытия на WinXP или в Virtual PC на Win7, но может быть успешно завершен нажатием File >> Exit?` Что именно происходит, когда нажать на кнопку? У меня никогда не было проблем с этим; фактически, поскольку [NTVDM перестал работать правильно] (http://superuser.com/questions/419435/fixing-a-broken-ntvdm) в моей системе XP, я * должен * закрыть некоторые программы, такие как Редактировать, нажав кнопку Кнопка `[x]`. Synetech 10 лет назад 0
@Synetech Ну, я сначала хотел опубликовать скриншот, но моя ОС на традиционном китайском. Все сообщения об ошибках находятся в Trad. Китайский язык. Является ли публикация сообщения об ошибке easiler, чтобы понять мою проблему? Kevin Dong 10 лет назад 0
@Synetech Я разместил скриншот только сейчас :-) Kevin Dong 10 лет назад 0
@KevinDongNaiJia Не могли бы вы попытаться перевести это? В качестве альтернативы, вы можете нажать Ctrl + C, чтобы скопировать диалог (работает в большинстве диалогов Windows), а затем вставить его в вопрос - нам гораздо проще скопировать-вставить-перевести, чем прочитать его с изображения. Bob 10 лет назад 0
@daxlerod Спасибо за вашу помощь. Когда вы опубликовали сообщение об ошибке на английском языке, я набирал эти слова в Google Translation. PS: это сообщение об ошибке не может быть скопировано и вставлено ... :-) Kevin Dong 10 лет назад 0

1 ответ на вопрос

1
Synetech

Почему edit.com может быть успешно завершен, нажав Файл → Выход, но не нажав кнопку закрытия ☒? Почему кнопка закрытия вызывает запрос убить его?

TL; DR

Поскольку Edit - это программа для DOS, поэтому File → Exit не имеет ничего общего с Windows или кнопкой.

Подсистемы

В Windows есть две основные подсистемы («рамки», если хотите), которые программа может использовать, чтобы упростить задачу и избежать того, чтобы программисту приходилось делать все вручную и заново изобретать колесо. Существует стандартная подсистема Windows и консольная подсистема.

Программы Windows - это программы с графическим интерфейсом (GUI), в то время как консольные программы - это программы с интерфейсом командной строки. Это очень разные дизайны, и то, что работает для одного, не работает для другого.

Подсистема Windows

Подсистема windows является более распространенной, и программы, которые имеют графические окна и элементы управления, будут использовать ее. «Сердцем» программы является цикл сообщений Windows . После того, как программа инициализирована и подготовлена ​​к запуску, она войдет в бесконечный цикл, где бездействует, терпеливо ожидая, что что-то произойдет. Это может включать ввод от пользователя, отключение таймера, сетевую активность и т. Д. Когда Windows обнаруживает некоторые изменения, на которые программа должна или может захотеть ответить, она отправит этой программе сообщения . В этот момент, если сообщение о чем-то, в чем заинтересована программа, оно ответит на него обработчиком, который является просто функцией, которая что-то делает.

(Так же работает большинство игр. У них будет основной игровой цикл, который ожидает ввода от кнопок геймпада, таймеров и т. Д., Затем он обновляет игровой мир, отображает фрейм, выводит его на экран и начинает заново. .)

Зависшие программы

Обычно, когда программа получает сообщение, она либо обрабатывает его, либо передает его. Обычно это происходит быстро. Однако иногда программа может зависнуть по какой-то причине, что приведет к тому, что она не будет обрабатывать сообщения. Windows может определить, когда это происходит, и если это займет слишком много времени, она сочтет программу замороженной и предложит пользователю убить не отвечающую программу вместо того, чтобы позволить ее корректно завершить работу. Это означает, что он внезапно завершится и не только потеряет несохраненные файлы, но потенциально оставит открытые файлы в несогласованном состоянии, что приведет к их повреждению.

Консольная подсистема

Консольные программы отличаются от графических программ Windows. Они произошли от своих предков DOS, и хотя они получили много новой функциональности из командной строки Windows, под всем этим они функционируют во многом как старые программы DOS, включая то, как они запускаются, работают и закрываются.

Закрытие программы

Давайте рассмотрим, что происходит, когда вы нажимаете кнопку для обоих видов программ.

Закрытие программы Windows

Когда вы нажимаете кнопку программы Windows, Windows отправляет этой программе WM_CLOSEсообщение. Цикл программы обнаруживает сообщение и отвечает, вызывая функцию, которая проходит стандартную процедуру завершения программы Windows (надеюсь, после первой очистки, такой как освобождение выделенных ресурсов, сохранение файлов и т. Д.). Помимо любой работы по очистке, фактическая маршрутизация при отключении происходит довольно быстро, и Windows переходит к следующей задаче.

Закрытие консольной программы

Когда вы нажимаете кнопку командной строки, вы предлагаете командной строке закрыть. Когда он получает это сообщение, он пытается закрыться, и если вы бездействуете в приглашении, он, безусловно, может сделать это без особых колебаний. Но что произойдет, если у вас есть какая-то программа, открытая и работающая в командной строке? Эта программа является отдельным процессом в целом. Командная строка не может просто убить эту программу, которая не будет удобной для пользователя и может повредить данные или потерять несохраненные файлы. Вместо этого он пытается передать закрытое сообщение программе. Есть два сценария, которые могут разыграться на этом этапе:

  • Если программа является консольной программой Windows, то отправка сообщения о закрытии обычно работает немедленно, поскольку она была скомпилирована с помощью консольной подсистемы Windows, и, хотя вы можете потерять некоторые несохраненные файлы, поскольку она использует специфичный для Windows консольный код, существует без задержки, и поэтому Windows не нужно прибегать к его уничтожению.

  • Если программа является программой для DOS (например, Edit), то она была скомпилирована для запуска в DOS и, таким образом, ничего не знает о Windows и поэтому не отвечает, поэтому Windows думает, что она зависла, и предлагает убить программу.

Файл → Выход

В Windows-программе команда выхода (обычно File → Exit) является просто псевдонимом для WM_CLOSE. Когда вы выходите из программы, она получает сообщение о закрытии, как если бы вы нажали кнопку закрытия.

С Edit, команда выхода (также File → Exit) не имеет ничего общего с Windows. Это встроенная функция самой программы DOS. Поэтому, когда вы нажимаете кнопку закрытия, это совсем не то, что выход из режима редактирования, поэтому нажатие не сообщает программе о закрытии.

Разные результаты

Но почему Кевин получает другой результат от других (и меня)? Вероятно, это связано с разницей в тайм-ауте, который Windows настроил для своих подпрограмм, определяющих, когда программа «зависла». На самом деле есть несколько различных настроек, которые влияют на это. Изменение настроек приведет к тому, что Windows будет ждать больше или меньше времени, прежде чем появится диалоговое окно.

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

Synetech, отличный ответ, но * довольно, пожалуйста *, жирным шрифтом / сильным последним пунктом, потому что ... ну, все, что там есть, можно суммировать до "EDIT не знает, что Windows существует, и наоборот". Doktoro Reichard 10 лет назад 0
Хороший, длинный ответ, но он не касается центральной точки. Попытка закрыть DOS-приложения не всегда дает сбой. Я только что попытался закрыть `edit.com` на компьютере с Windows XP, и он сразу же закрыл окно, отменив сделанные мной изменения. Другими словами, это может быть сделано, и что-то должно отличаться между моей системой и запрашивающим, например, настройка или способ, которым он запускает `edit.com`. nitro2k01 10 лет назад 0
@ nitro2k01, на самом деле, это именно то, что [я сказал] (http://superuser.com/questions/689664/why-edit-com-16-bit-on-winxp-or-in-virtual-pc-on-win7 -cannot-выход-успешно / 689876 # comment875864_689664); Я * должен * закрыть DOS-программы, такие как Edit, с помощью кнопки закрытия, потому что мой NTVDM сломан, и у меня нет проблем. Я написал этот ответ на основе скриншота, который он добавил. У меня есть представление о том, в чем может быть разница, и я добавлю некоторую информацию об этом. Synetech 10 лет назад 0

Похожие вопросы