该指针类型防水吗?

时间:2019-06-30 19:20:54

标签: vba pointers cross-platform conditional-compilation vba6

我正在尝试设计一种自定义类型,该类型可以在需要窗口句柄或其他类型指针的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版本-OS)。
  2. VBA7引入了LongPtr类型,它在64位主机中的值为LongLong,在32位主机中的值为Long-在Mac或Windows上它应该可以正常工作(知道它在16位主机上的功能,但是VBA7甚至可以在该主机上运行吗?)。那是第一张支票
    • VBA7是VBA的最新版本,因此无需检查最新版本。 但是出于兴趣,我有办法吗?
  3. 接下来,我检查VBA7之前的主机是否存在误码;我认为它不可能是64,但以防万一,这需要自定义LongLong类型(因为仅在VBA7中定义)
    • 有趣的是,Win64也可以在Mac上使用-这个名称确实令人误解
  4. 类似的检查分别在16位和32位进行-仅它们不需要自定义类型(我假设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等?

0 个答案:

没有答案