Общепринятое мнение:
В последней версии VBA (VBA7) используйте тип LongPtr
для представления указателей, который работает как в 32-, так и в 64-битных системах. В старых версиях VBA используйте Long
для обозначения указателей (предполагается, что 32-разрядный хост, но , это безопасное предположение , поскольку все 64-разрядные хосты используют последнюю версию VBA).
А что такое LongPtr? Хорошо согласно справочнику по языку VBA :
LongPtr
(Long
целое число в 32-разрядных системах, LongLong
целое число в 64-разрядных системах)
Эти две части информации подтверждают один факт: В 32-разрядных системах указатели занимают 4 байта и должны храниться в Long
, в 64-разрядных системах указатели занимают 8 байтов и должны быть сохраненным в LongLong
и, соответственно, LongPtr
выглядит под капотом примерно так:
#If Win64 Then
typedef LongPtr As LongLong
#Else
typedef LongPtr As Long
#End If
т.е. размер указателя напрямую связан с битностью хоста , По моему опыту, эта интерпретация всегда работала нормально.
Задача
Как указывалось в , этот вопрос , указатели имеют тенденцию быть такой же размер, как битность архитектуры. Например, для 32-битной программы указатели - 4 байта, для 64-битной программы - 8 байтов. Однако нет никаких причин для этого обязательно ; программа с 64-битным объемом памяти может по-прежнему использовать 32-битные указатели для навигации по ней.
Это дает вам смысл подумать об этом. То, что моя 64-битная программа использовала 8-байтовые блоки для разделения своей памяти, не означает, что мне нужно 2 ^ 64 различных возможных указателя для навигации по ней. У меня может быть всего 16 байтов памяти, в этом случае мой указатель может быть просто 1
или 0
!
Итак, мои вопросы:
- LongPtrs определяется в соответствии с битностью хоста?
- Если да, то есть ли причина, по которой это безопасно? - есть ли что-то в VBA, что означает, что указатели всегда будут соответствовать размеру разрядности хост-программы?
- Если нет, то как они определили?
- Это как-то связано с компилятором, используемым для хост-программы?
- Будет ли длина указателя изменяться в зависимости от хостов Excel или Word или SolidWorks?