首页 > 解决方案 > Excel 4.0 宏不适用于 64 位 Excel,并且“VirtualAlloc”返回 8 字节中的 4 字节

问题描述

我正在尝试分析https://outflank.nl/blog/2018/10/06/old-school-evil-excel-4-0-macros-xlm中介绍的 Excel 4.0 宏示例。

在测试时,我注意到它在 32 位 Excel 上运行良好,但在 64 位上无法正常运行。

最终,我找到了原因,那就是:VirtualAlloc函数总是返回 8 个字节中的 4 个字节。

这里的实现:

= REGISTER("Kernel32", "VirtualAlloc", "JJJJJ", "valloc", , 1, 9)
= valloc(0, 64 * 1024, 4096, 64)

如何解决?

标签: excelwindowsapiexcel-4.0

解决方案


您已将返回类型声明为“J”,它只有 32 位/4 字节长。

您可以尝试“D”,它是 8 字节长,然后使用 mem 复制函数将其复制到一个 8 字节变量,或者您可以尝试放入一个 dummy 参数,并尝试从 dummy 恢复接下来的 4 个字节范围。

当您错误地声明外部调用时,Excel 不会崩溃,因为 Excel 在每次调用后都会进行堆栈检查,并确保堆栈已正确还原。

或者可能是 64 位 Excel 在 XLM 宏中支持 64 位长,使用一些新的类型声明——我还没有看到,但我想它值得一看。


推荐阅读