Является ли этот тип указателя водонепроницаемым? - PullRequest
1 голос
/ 30 июня 2019

Я пытаюсь разработать собственный тип, который можно использовать в 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 представил тип LongPtr, который оценивается как LongLong на 64-битных хостах, Long на 32-битных хостах - 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 должна исключить полное определение в таких системах, поэтому я не знаю, почему это проблема - я задал вопрос об этом.

В любом случае код по-прежнему работает так, как ожидалось; любая переменная типа 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 и т. Д.?

...