Я пытаюсь разработать собственный тип, который можно использовать в 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
Логика такова:
- Only the bitness of the Office host matters, not of the operating system. Is this definitely correct, I'm not sure?
Win64/32/16
misleadingly refer to that the version of Office (not the version of Windows - the OS - as the name may suggest).
- VBA7 introduced the
LongPtr
type which evaluates toLongLong
in 64 bit hosts,Long
in 32 bit hosts - Mac or Windows it should just work (I don't know what it does on a 16 bit host, but can VBA7 even be run on that?). So that's the first check- VBA7 is the last edition of VBA so no need to check for more modern than that. But out of interest, is there a way I could?
- Next I check for bitness of a pre-VBA7 host; I don't think it can ever be 64, but just in case, that requires a custom
LongLong
type (since that's only defined in VBA7)- Interestingly
Win64
works on Macs too - the name really is misleading
- Interestingly
- Аналогичные проверки выполняются для 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 и т. д.?
#If Win64 And VBA7 = 0
делает то, что вы думаете? - person Jim Mack   schedule 01.07.2019And
оценивается после=
. Но я сделал это более явным, нет причин не - person Greedo   schedule 01.07.2019