1

Что означает сообщение об ошибке ntvdm «Подсистема Win 16 имеет недостаточно ресурсов для продолжения работы. Нажмите кнопку ОК, закройте свои приложения и перезагрузите компьютер. "Значит, и как это можно предотвратить?

(Интересно, но, предположительно, не связанная с проблемой, диалоговое окно, отображающее сообщение, фактически принадлежит процессу сеанса csrss.exe .)

2 ответа2

2

Согласно http://www.vttoth.com/wow32.htm, это сообщение об ошибке возникает, когда GDI возвращает дескриптор выше 16383 для вызова, сделанного от имени 16-разрядной программы Windows. Ручки могут доходить до 65535, но, очевидно, они получают право- сдвинутый влево на 2 бита перед тем, как его вернут в 16-битное приложение по какой-то причине (предположительно совместимость с чем-либо)

До Windows XP такого не могло быть, поскольку только 16384 объектам GDI было разрешено существовать в любом конкретном сеансе, но с XP предел был увеличен до 65536 объектов GDI. Поскольку GDI, очевидно, выделяет новый номер дескриптора только тогда, когда используются все более низкие номера дескрипторов, это может произойти, только если в сеансе одновременно существует более 16384 объектов GDI.

Перезагрузка, как правило, исправляет эту ситуацию, если предположить, что автоматически запускаемые программы не сразу проходят через первые дескрипторы 16384.

Если включено "быстрое переключение пользователей", другим вариантом будет выйти из системы, войти в другую учетную запись (например, "гость") и войти снова. (Здесь важно получить новую "сессию"; если вы не запускали "сессию 0" для начала, шаг "зарегистрировать другую учетную запись" не имеет значения.)

Связанная страница также предлагает патч для удаления изменений из wow32.dll . Будьте осторожны: как говорится на странице, применение этого патча может быть незаконным; Более того, это может быть опасно и, безусловно, нарушит работу любого приложения, для которого был добавлен сдвиг.

-1

С тех пор, как компьютеры превратились из 16-битных компьютеров в 32-битные, люди стали видеть это сообщение об ошибке. Как заявляет SamB - есть несколько способов, которыми вы можете научить программу работать, но в конечном итоге - вы увидите это сообщение снова и снова. Как говорит SamB, реальная проблема заключается в том, что в настоящее время существует так много других программ, которые работают в фоновом режиме, что ограничение в 16 КБ превышается только при запуске вашего компьютера. Под 32-битной ОС эта проблема не появляется, потому что у вас есть намного больше дескрипторов, с которыми можно работать. НО! Ваше 16-битное приложение не может справиться с этим. Он был написан для работы под 16-битной ОС. Это означает, что он должен был работать под Windows v3.1 или Windows v95. Windows v98(se) или Windows vME - это 32-битные ОС, так что даже там вы столкнетесь с этой проблемой.

Мое решение - скачать Virtual PC от Microsoft (это бесплатно) или загрузить Virtual Box из Oracle (это тоже бесплатно), установить копию Windows v3.1 или Windows v95 и запустить программу под ОС, для которой она предназначена. бежать под

Теперь, к сожалению, если вы не сохранили свои дискеты с Windows v3.1 или Windows v95 (или компакт-диск в случае Windows v95), вам придется их найти и купить. Или вы можете обратиться в Microsoft с просьбой о копировании, но я не верю, что они их сохранили или выпустят. (В отличие от Apple Computer Inc., которая выпустила бесплатно DOS 3.3, ProDos, ProDos для //gs и Mac OS до версии 9.x)

Так что это мое предложение / ответ. Для Windows v3.1 и Windows v95 я бы больше склонялся к Virtual PC, так как он действительно прекрасно работает под Windows XP, а также вплоть до использования DOS, DR DOS и даже IBM PC DOS или BDOS.

Обновление: 27.01.2016

Чтобы лучше ответить на вопрос SamB о несовместимости (о котором я не говорил). Давайте посмотрим на 8-битную ОС. 8-битная ОС ожидала, что все различные стеки (стек вызовов, дескрипторы и т.д.) Будут иметь определенный размер и не превышать этот размер. Когда вы превысите его - вы получите синий экран смерти или, возможно, ваша система просто перезагрузится. Когда пришли 16-битные ОС, 8-битные программы работали так, как будто они работали в 8-битной системе. Это означало, что если бы они превышали 8-битный размер выделения, они, вероятно, все равно дали бы вам синий экран смерти, или ваша система все равно просто перезагрузилась бы. МНОГИЕ компании никогда не заботились о сбоях компьютеров, если клиенты не жаловались на это. (Обычно называется синдромом скрипучего колеса.) Microsoft пыталась облегчить эти проблемы, тестируя столько программ, сколько они могли бы для каждой ОС, но дело в том, что некоторые программы просто не будут работать под более новой ОС. Мое подозрение (и НЕ ФАКТ) состоит в том, что некоторые из этих ранних стеков были заколдованы против другого стека, поэтому, если вы переполнили один стек, это может отрицательно повлиять на другой стек. Помните, что память не была дешевой, как сегодня, поэтому вы пытались втиснуть в память как можно больше. Мне самому много раз удавалось разбить мой Apple] [+, а также мой IBM PC XT просто потому, что я вызвал переполнение стека. Одной из других проблем является (как я уже сказал), что там было много плохих программистов, которые не заботились об очистке своих программ. Таким образом, они будут выделять память, стековую память, дескрипторы и всякие другие вещи, а не освобождать их. Ваш единственный намек на то, что это происходит, заключается в том, что ваш компьютер будет работать все медленнее и медленнее, пока вы не перезагрузите его. Перезагрузка очистит все данные из памяти, вернет все это в вашу ОС, и ваша ОС снова будет работать быстрее. Как я уже сказал, это похоже на работу программ TSR или Terminate and Stay Resident. В современных операционных системах - много раз процессы изолированы от других процессов, и сама ОС заботится о высвобождении памяти обратно в пул (а также об очистке стека или даже выделении нового стека каждому процессу, чтобы каждый процесс мог обойти свои собственные стек, но не стек ОС). Проблема, однако, в том, что более старые программы из эпохи 16-битных ОС были статически ориентированы. Таким образом, библиотеки и др. Были включены в программу. Это означает, что он может попытаться переопределить то, что текущая ОС говорит, что может сделать. Таким образом, 16-битная программа может сказать "запись в местоположение XYZ", но "XYZ" является частью более новой ОС. Итак, вы перезаписали, кто знает, что и ваша система может зависнуть или зависнуть из-за этого. Если у вас также есть права администратора - вы ДЕЙСТВИТЕЛЬНО можете все испортить. Таким образом, мое предложение использовать Virtual PC, переустановить более раннюю ОС - и запустить программу под той ОС, под которой она должна была работать. Во-первых, у вас больше шансов иметь возможность запустить программу там, а во-вторых, если она дает сбой, вы теряете только виртуальную систему, а не всю вашу компьютерную систему.

Но это не "несовместимо", а "архаично". Чтобы действительно упростить задачу, вы можете думать об этом следующим образом: стеки по 8 бит = 8 000 стеков, 16 бит = 16 стеков, 32 бита = стеки по 32 КБ и т.д. Это не точно, но все же видно, что разные ОС использовали разные размеры для всего. Вот почему у вас возникают проблемы, когда вы переносите что-то из одной ОС в другую.

Имеет ли это смысл?

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .