我正在尝试设计一种自定义类型,该类型可用于需要窗口句柄或其他类型指针的 API,并且适用于 VBA 可以运行的所有系统。这是我所拥有的:
#If (Win64 = 1) And (VBA7 = 0) Then
Public Type LongLong '64-bit systems pre-VBA7 wouldn't have had LongLong
LoPart As Long
HiPart As Long
End Type
#End If
Public Type Pointer 'could alternatively make a LongPtr type for pre VBA7 systems only
#If VBA7 Then
Address As LongPtr 'should always be correct right?
#ElseIf Win64 Then
Address As LongLong 'should never exist as VBA6 and lower are 32 or 16 bit
#ElseIf Win16 Then
Address As Integer '16 bit address, is this correct?
#Else
Address As Long '32 Bit pre-VBA7 system
#End If
End Type
逻辑是:
- 只有 Office 主机的位数很重要,而不是操作系统。这绝对正确吗,我不确定?
Win64/32/16
误导性地提到 Office 的版本(而不是 Windows 的版本 - 操作系统 - 顾名思义)。
- VBA7 引入了在 64 位主机
LongPtr
中评估的类型,在 32 位主机中 - Mac 或 Windows 它应该可以正常工作(我不知道它在 16 位主机上做了什么,但 VBA7 甚至可以在上面运行吗?)。所以这是第一次检查LongLong
Long
- VBA7 是 VBA 的最后一个版本,因此无需检查更现代的版本。但是出于兴趣,有什么办法可以吗?
- 接下来,我检查 VBA7 之前的主机的位数;我不认为它可以是 64,但以防万一,这需要一个自定义
LongLong
类型(因为它只在 VBA7 中定义)- 有趣
Win64
的是,它也可以在 Mac 上工作——这个名字真的很误导人
- 有趣
- 类似的检查发生在 16 位和 32 位——只是它们不需要自定义类型(我假设
Integer
是在 16 位 VBA 中定义的,并且它是使用正确的数据类型——我从来没有遇到过,所以我真的不能查看)
现在的一个问题是该LongLong
类型在 64 位VBA7系统中标记了错误;我假设因为LongLong
这些系统上已经存在所以不是类型的有效名称。但是#If Win64 And VBA7 = 0
检查应该排除此类系统中的整个定义,所以我真的不知道为什么会出现问题 - 我已经问过一个问题。
无论哪种方式,代码仍然按预期运行;任何类型的变量都LongLong
默认为内置变量,而不是 VBA7 中的我的变量——我只是Public Type LongLong
在编辑器中以红色突出显示,这有点痛苦。解决方法是重命名它并避免冲突(但也会改变语义,这意味着它LongLong
不能在其他地方使用)。或者将指针重新定义为
Public Type Pointer
#If VBA7 Then
Address As LongPtr 'should always be correct right?
#ElseIf Win64 Then
AddressLo As Long
AddressHi As Long
#ElseIf Win16 Then
Address As Integer '16 bit
#Else
Address As Long '32 Bit
#End If
End Type
这会稍微改变界面。
那么这种类型是否适用于所有系统,Mac Windows、32 64 位、VBA7 VBA6 等?