我正在尝试设计一种自定义类型,该类型可以在需要窗口句柄或其他类型指针的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
逻辑是:
Win64/32/16
误导性指Office版本(顾名思义,不是Windows版本-OS)。LongPtr
类型,它在64位主机中的值为LongLong
,在32位主机中的值为Long
-在Mac或Windows上它应该可以正常工作(知道它在16位主机上的功能,但是VBA7甚至可以在该主机上运行吗?)。那是第一张支票
LongLong
类型(因为仅在VBA7中定义)
Win64
也可以在Mac上使用-这个名称确实令人误解Integer
是在16位VBA中定义的,并且它是使用的正确数据类型-我从来没有来过跨越它,所以我无法真正检查)现在,一个问题是LongLong
类型在64位 VBA7 系统中标记为错误;我假设是因为LongLong
在这些系统上已经存在,所以不是有效的类型名称。但是#If Win64 And VBA7 = 0
检查应该排除此类系统中的整个定义,所以我真的不知道为什么会出现问题-我已经问过question。
无论哪种方式,代码仍然可以按预期运行;在VBA7中,任何类型为LongLong
的变量都默认为内置变量而不是默认变量-我只是在编辑器中将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等?