1

我正在尝试设计一种自定义类型,该类型可用于需要窗口句柄或其他类型指针的 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

逻辑是:

  1. 只有 Office 主机的位数很重要,而不是操作系统。这绝对正确吗,我不确定?
    • Win64/32/16误导性地提到 Office 的版本(而不是 Windows 的版本 - 操作系统 - 顾名思义)。
  2. VBA7 引入了在 64 位主机LongPtr中评估的类型,在 32 位主机中 - Mac 或 Windows 它应该可以正常工作(我不知道它在 16 位主机上做了什么,但 VBA7 甚至可以在上面运行吗?)。所以这是第一次检查 LongLongLong
    • VBA7 是 VBA 的最后一个版本,因此无需检查更现代的版本。但是出于兴趣,有什么办法可以吗?
  3. 接下来,我检查 VBA7 之前的主机的位数;我不认为它可以是 64,但以防万一,这需要一个自定义LongLong类型(因为它只在 VBA7 中定义)
    • 有趣Win64的是,它也可以在 Mac 上工作——这个名字真的很误导人
  4. 类似的检查发生在 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 等?

4

0 回答 0