Является ли этот тип указателя водонепроницаемым?

Я пытаюсь разработать собственный тип, который можно использовать в 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. 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).
  2. VBA7 introduced the LongPtr type which evaluates to LongLong 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?
  3. 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
  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 и т. д.?


person Greedo    schedule 30.06.2019    source источник
comment
Ничего не знаю о вашей проблеме, но уверены ли вы, что #If Win64 And VBA7 = 0 делает то, что вы думаете?   -  person Jim Mack    schedule 01.07.2019
comment
Я бы рекомендовал этот пост для обзора кода: codereview.stackexchange.com   -  person Dean    schedule 01.07.2019
comment
@Дин Нет. Учитывая, что OP заявляет Теперь одна проблема заключается в том, что тип LongLong помечает ошибку в 64-битных системах VBA7, код еще не готов для проверки.   -  person 301_Moved_Permanently    schedule 01.07.2019
comment
#Win16 не имеет значения и всегда ложно, 16-битной версии офиса не было уже 25 лет. 64-разрядные системы до VBA7 — это не имеет значения, Office 2010 был первой 64-разрядной версией и поставлялся с VBA7, любые предыдущие версии, независимо от версии Windows, в которой они работают, не нужны. типа 64-битного указателя.   -  person Alex K.    schedule 01.07.2019
comment
Кажется, вы нацелены на VBA, но этот вопрос также помечен как vb6. Вы спрашиваете, будет ли этот тип работать и на VB6 (автономный не-VBA pre-dotNET VB)?   -  person    schedule 01.07.2019
comment
@JimMack Я совершенно уверен, что это так, я считаю, что приоритет оператора означает, что And оценивается после =. Но я сделал это более явным, нет причин не   -  person Greedo    schedule 01.07.2019
comment
@ПитерКуперДжр. Хороший улов, это ошибка. Хотя разницы почти нет, я явно не ориентируюсь на VB6 — на самом деле я имел в виду VBA6, который является старой версией VBA7 (текущий офис — VBA7.1), но он все еще висит на компьютерах Mac и других местах. Тем не менее, я был бы счастлив, если бы это работало и на VB6, но я даже не знаю, с чего начать с совместимости с VB, поэтому пока оставлю это. Вопрос обновлен   -  person Greedo    schedule 01.07.2019
comment
@MathiasEttinger У меня раздвоение сознания; если вы посмотрите на связанный вопрос, ошибка - пока кто-нибудь не исправит меня иначе - только проблема с подсветкой синтаксиса (подсветка IDE игнорирует условную компиляцию). Насколько я могу судить, сам код компилируется и работает, как и ожидалось (хотя я не могу его протестировать, потому что у меня нет доступа к нужным средам). Моя основная причина не позировать на CR заключалась в том, что я не уверен на 100%, что это вообще правильно, но я думаю, что это работает так, как задумано, насколько мне известно   -  person Greedo    schedule 01.07.2019
comment
Ну, это немного серая зона, но делает ли этот код то, что я думаю? Такие вопросы не подходят для CR. Если вы когда-нибудь протестируете его и убедитесь, что он работает, это будет прекрасно.   -  person 301_Moved_Permanently    schedule 02.07.2019