Макрос Excel 4.0 не работает в 64-разрядной версии Excel, и функция «VirtualAlloc» возвращает 4 байта из 8 байтов - PullRequest
0 голосов
/ 08 февраля 2019

Я не уверен, что это правильное место для публикации, но я потратил довольно много времени, пытаясь решить эту проблему, но не смог найти никаких решений.

Я пытаюсь проанализировать EXCEL 4.0образец макроса, введенный в https://outflank.nl/blog/2018/10/06/old-school-evil-excel-4-0-macros-xlm.

Во время тестирования образца я столкнулся с проблемой.Он хорошо работает на 32-битном EXCEL, но не работает должным образом на 64-битных.В конце концов, я нашел причину, а именно: VirtualAlloc функция всегда возвращает 4 байта из 8 байтов.

Реализация здесь:

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

Может ли кто-нибудь научить меня, что решениеявляется?Заранее спасибо.

PS Если этот вопрос не подходит для этого сообщества, пожалуйста, дайте мне знать правильное место для публикации.

1 Ответ

0 голосов
/ 08 февраля 2019

Вы объявили тип возвращаемого значения как «J», длина которого составляет всего 32 бита / 4 байта.

Вы можете попробовать «D», длина которого составляет 8 байт, а затем использовать функцию копирования копии памяти.скопировать его в 8-байтовую переменную, или вы можете попробовать ввести фиктивный параметр и попытаться восстановить следующие 4 байта из фиктивного параметра.

Excel не вылетает при неправильном объявлении внешних вызовов,потому что Excel выполняет проверку стека после каждого вызова и гарантирует, что стек восстанавливается правильно.

Или может быть так, что 64-битный Excel поддерживает 64-битную длину в макросах XLM, используя некоторое новое объявление типа -- Я этого не видел, но думаю, стоило бы посмотреть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...