Почему некоторые из старых Win16 API все еще поддерживаются в новых версиях Windows?
Недавно я исправлял некоторые IAT в упакованном исполняемом файле MoleBox и увидел, что он связывается с функциями kernel32: _lopen, _lwrite и _lread. На этом сайте говорится, что эти API-интерфейсы предназначены для совместимости с 16-разрядными версиями Windows. Я понимаю, что приложения 'Win16' не могут выполняться в длинном режиме (да - я использую Win8.1 x64) - так с какой целью они все еще должны быть включены в "kernel32.dll"?
Кстати, эти функции даже не включены в библиотеку msdn.
РЕДАКТИРОВАТЬ: Кажется также, что эти функции на самом деле не 16-битные! Они принимают 32-битные параметры в стеке.
2 ответа
Дело не в том, что функции могут вызываться 16-битными приложениями. Ясно, что они не могут, потому что они живут в 32-битных и 64-битных модулях. Суть в том, чтобы (было) облегчить разработчикам компиляцию старых программ без необходимости переписывать их.
Теперь, в 2015 году, нет необходимости обслуживать разработчиков, у которых есть 16-битные программы, которые они хотели бы перекомпилировать. Это, вероятно, больше не происходит на каком-либо значительном уровне. Но если вы отбросите время на 20 лет назад, это станет настоящей проблемой. И следовательно MS включил эти костыли компата. И как только они были включены, MS, вероятно, решил оставить их там, чтобы не нарушать бинарную совместимость. MS делает все возможное, чтобы не сломать старые программы. Если бы эти функции были удалены, любые программы, которые полагаются на них, сломались бы.
Microsoft не удаляет функции "только потому, что" они старые. Они удалят эти функции, как только они потребуют повторной реализации, но сейчас для их сохранения требуется меньше работы.