为什么较新的 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" 它们已经过时了。他们将在需要重新实现时立即删除这些功能,但现在保留它们所需的工作更少。
我最近在 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" 它们已经过时了。他们将在需要重新实现时立即删除这些功能,但现在保留它们所需的工作更少。