一般常识:
在最新版本的 VBA(VBA7)中,使用
LongPtr类型来表示指针,在 32 位和 64 位系统上都可以使用。在旧版本的 VBA 中,用于Long表示指针(假设是 32 位主机,但这是一个安全的假设,因为所有 64 位主机都使用最新版本的 VBA)。
LongPtr 到底是什么?那么根据VBA语言参考:
LongPtr(Long32 位系统上的LongLong整数,64 位系统上的整数)
这两条信息证实了一个事实:在 32 位系统上,指针占用 4 个字节并且应该存储在 a 中Long,在 64 位系统上,指针占用 8 个字节并且应该存储在 aLongLong
并且通过扩展,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 个字节的内存,在这种情况下,我的指针可能只是1or 0!
所以我的问题:
- LongPtrs 是否根据主机位数定义?
- 如果是这样,是否有理由这样做是安全的 - VBA 是否有一些东西意味着指针将始终与主机程序的位数大小匹配?
- 如果不是,它们是如何定义的?
- 它与用于主机程序的编译器有关吗?
- Excel 或 Word 或 SolidWorks 主机之间的指针长度会有所不同吗?