Почему некоторые из старых API Win16 все еще поддерживаются в более новых версиях Windows?

Недавно я чинил IAT в упакованном исполняемом файле MoleBox и увидел, что он связан с функциями ядра 32: '_lopen', '_lwrite' и '_lread'. На этом сайте указано, что эти API предоставляются для совместимости с 16-разрядными версиями Windows. Я понимаю, что приложения «Win16» не могут выполняться в долгом режиме (да, я использую Win8.1 x64) — так с какой целью они все еще включены в «kernel32.dll»?

Кстати, эти функции даже не включены в библиотеку «msdn».

РЕДАКТИРОВАТЬ: Также кажется, что эти функции на самом деле не 16-битные! Они принимают 32-битные параметры в стеке.


person AnArrayOfFunctions    schedule 08.01.2015    source источник
comment
Конечно они не 16 битные. kernel32.dll — это 32- или 64-битный модуль. Кроме того, тот факт, что функция принимает 32-битные параметры, не делает ее 32-битной.   -  person David Heffernan    schedule 08.01.2015
comment
Потратьте некоторое время на чтение архивов в блоге Рэймонда Чена, где он часто обсуждает старую совместимость код, который задерживается.   -  person Ken White    schedule 08.01.2015
comment
Основная причина, конечно, в том, что не было абсолютно никакого смысла не включать их и заставлять программистов переписывать свои старые программы. Реализация их в 32-битной среде была тривиальной.   -  person Hans Passant    schedule 08.01.2015
comment
Забавно, но кажется, что эти «16-битные» функции поддерживаются и в 64-битных модулях! Это похоже на совершенно новую вселенную для меня. Возможно, мне следует создать новый вопрос - когда использовать Win32 или Win16 API.   -  person AnArrayOfFunctions    schedule 08.01.2015
comment
Я думал, что объяснил это в своем ответе. Думаю, я недостаточно хорошо поработал. Что ты не понял?   -  person David Heffernan    schedule 08.01.2015
comment
Не волнуйся Бро, я все понимаю.   -  person AnArrayOfFunctions    schedule 08.01.2015
comment
когда использовать Win32 или Win16 API - последнее предназначено для устаревшей кодовой базы, вы должны использовать Win32 API, когда это возможно. Тот факт, что вы можете использовать устаревший API, не означает, что вы должны, если только у вас нет особых требований (нужна целевая версия Win3.1 и старше)   -  person raymai97    schedule 02.08.2019


Ответы (2)


Дело не в том, что функции могут вызываться 16-битными приложениями. Ясно, что они не могут, потому что они живут в 32-битных и 64-битных модулях. Дело в том (было) в том, чтобы облегчить разработчикам компиляцию старых программ без необходимости их переписывать.

Теперь, в 2015 году, нет реальной необходимости обслуживать разработчиков, у которых есть 16-битные программы, которые они хотят перекомпилировать. Это, вероятно, больше не происходит на сколько-нибудь значительном уровне. Но если откатить часы на 20 лет назад, то это было настоящей проблемой. И поэтому MS включила эти компатные костыли. И раз они были включены, то MS, вероятно, решила оставить их там, чтобы не нарушать бинарную совместимость. MS делает все возможное, чтобы не сломать старые программы. Если бы эти функции были удалены, любые программы, использующие их, сломались бы.

person David Heffernan    schedule 08.01.2015

Microsoft не удаляет функции «только потому, что» они устарели. Они уберут эти функции, как только потребуют повторной реализации, но пока для их сохранения требуется меньше усилий.

person MSalters    schedule 08.01.2015