我最近在 MoleBox 打包的可执行文件上修复了一些 IAT,发现它链接了 kernel32 函数:'_lopen'、'_lwrite' 和 '_lread'。这site声明提供这些 API 是为了与 16 位版本的 Windows 兼容。我不知道“Win16”应用程序不能在长模式下执行(是的 - 我正在运行 Win8.1 x64)- 那么那些仍然包含在“kernel32.dll”中的目的是什么?
顺便说一下,这些函数甚至没有包含在“msdn”库中。
编辑:看起来这些函数实际上并不是 16 位的!他们在堆栈上获取 32 位参数。
最佳答案
并不是说函数可以被16位应用程序调用。显然他们不能,因为他们生活在 32 位和 64 位模块中。重点是(曾经)让开发人员更容易编译旧程序而无需重新编写它们。
现在,在 2015 年,没有真正需要满足拥有 16 位程序并希望重新编译的开发人员的需求。这可能不会再发生任何显着水平。但如果时光倒流 20 年,那么这才是真正令人担忧的问题。因此 MS 包括这些兼容的拐杖。一旦包含了它们,MS 可能决定将它们留在那里以免破坏二进制兼容性。 MS 确实竭尽全力避免破坏旧程序。如果删除这些功能,任何依赖它们的程序都会中断。
关于windows - 为什么较新的 Windows 版本仍支持某些旧的 Win16 API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27841903/