3

一般常识:

在最新版本的 VBA(VBA7)中,使用LongPtr类型来表示指针,在 32 位和 64 位系统上都可以使用。在旧版本的 VBA 中,用于Long表示指针(假设是 32 位主机,但这是一个安全的假设,因为所有 64 位主机都使用最新版本的 VBA)。

LongPtr 到底是什么?那么根据VBA语言参考

LongPtrLong32 位系统上的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 主机之间的指针长度会有所不同吗?
4

1 回答 1

1

第 2.3 节前的两段

https://interoperability.blob.core.windows.net/files/MS-VBAL/%5bMS-VBAL%5d.pdf

“还定义了实现定义的 LongPtr 类型别名,映射到实现将用于保存指针或句柄值的底层声明类型。32 位实现应该将 LongPtr 映射到 Long,64 位实现应该将 LongPtr 映射到 LongLong,尽管实现可以将 LongPtr 映射到实现定义的指针类型。LongPtr 类型别名在其基础声明类型有效的任何地方都有效。”

于 2020-04-04T17:39:14.150 回答