为什么较新的 Windows 版本仍支持某些旧的 Win16 API?

Why are some of the old Win16 API's still supported in newer Windows versions?

我最近在 MoleBox 打包的可执行文件上修复了一些 IAT,发现它与 kernel32 函数链接:“_lopen”、“_lwrite”和“_lread”。此 site 声明提供这些 API 是为了与 Windows 的 16 位版本兼容。我理解 'Win16' 应用程序不能在长模式下执行(是的 - 我正在运行 Win8.1 x64) - 那么那些仍然包含在 'kernel32.dll' 中的目的是什么?

顺便说一下,这些函数甚至没有包含在 'msdn' 库中。

编辑:看起来这些函数实际上并不是 16 位的!他们在堆栈上获取 32 位参数。

并不是16位应用程序可以调用这些函数。显然他们不能,因为他们生活在 32 位和 64 位模块中。关键是(曾经)让开发人员更容易编译旧程序而无需重新编写它们。

现在,在 2015 年,没有真正需要满足拥有 16 位程序并希望重新编译的开发人员的需求。这可能不会再发生任何显着水平。但如果时光倒流 20 年,那么这才是真正令人担忧的问题。因此 MS 包括这些兼容的拐杖。一旦包含了它们,MS 可能决定将它们留在那里以免破坏二进制兼容性。 MS 确实竭尽全力避免破坏旧程序。如果删除这些功能,任何依赖它们的程序都会中断。

Microsoft 不会删除函数 "just because" 它们已经过时了。他们将在需要重新实现时立即删除这些功能,但现在保留它们所需的工作更少。