Является ли этот тип указателя водонепроницаемым?
Я пытаюсь разработать собственный тип, который можно использовать в 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 представил
LongPtr
тип, который оцениваетLongLong
в 64-битных хостах,Long
на 32-битных хостах - Mac или Windows он должен просто работать (я не знаю, что он делает на 16-битном хосте, но может ли VBA7 даже работать на этом?). Так что это первая проверка- VBA7 является последним выпуском VBA, поэтому нет необходимости проверять более современный, чем это. Но из интереса, есть ли способ, которым я мог?
- Затем я проверяю битность хоста, предшествующего VBA7; Я не думаю, что это может быть 64, но на всякий случай, который требует
LongLong
тип (так как это определено только в VBA7)- что интересно
Win64
работает и на Mac - название действительно вводит в заблуждение
- что интересно
- Подобные проверки имеют место 16 и 32 бит - только они не нуждаются в пользовательских типах (я предполагаю,
Integer
был определен в 16-битном VBA, и что это правильный тип данных для использования - я никогда не сталкивался с этим, поэтому я не могу проверить)
Теперь одна проблема заключается в том, что LongLong
тип отмечает ошибку в 64-битных системах VBA7; Я полагаю, потому что LongLong
уже существует в этих системах, поэтому не является допустимым именем для типа. Но #If Win64 And VBA7 = 0
check должен исключить полное определение в таких системах, поэтому я не знаю, почему это проблема - я задал вопрос об этом.
В любом случае код по-прежнему работает так, как ожидалось; любая переменная типа 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 и т. Д.?