powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как определить, в чём работает программа: VBA6 или VBA7?
18 сообщений из 18, страница 1 из 1
Как определить, в чём работает программа: VBA6 или VBA7?
    #39647386
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начиная с Access 2010 появился VBA7. При чём Access должен их обоих поддерживать (вроде бы и VBA5 из Access 97).
У меня возник вопрос. Как определить, какой из версий VBA используется при исполнении программы.
При декларации API можно чётко задать версию. Используется слово PtrSafe - значит VBA7, нет - VBA6. А если нет API?


-------------------------------------------------------------
А ты вложил уже свой кровный рубль в 50-ти миллиардное состояние Билла Гейтса?
...
Рейтинг: 0 / 0
Как определить, в чём работает программа: VBA6 или VBA7?
    #39647401
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая связь между этим
JossКак определить, в чём работает программа: VBA6 или VBA7?
и этим
JossА если нет API??
А так то я с вас удивляюсь, кто это писал? Access. Переход с 32-х разрядной системы на 64-х разрядную. (Примерное реководство)
...
Рейтинг: 0 / 0
Как определить, в чём работает программа: VBA6 или VBA7?
    #39647404
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПанургКакая связь между этим
JossКак определить, в чём работает программа: VBA6 или VBA7?
и этим
JossА если нет API??
А так то я с вас удивляюсь, кто это писал? Access. Переход с 32-х разрядной системы на 64-х разрядную. (Примерное реководство) +1
Тоже удивился.
...
Рейтинг: 0 / 0
Как определить, в чём работает программа: VBA6 или VBA7?
    #39647416
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может я неправильно задал вопрос? Не так сформулировал свою мысль?

Статья про переход с 32-х разрядной системы на 64-х разрядную. Тут только VBA7. И Начиная с 2010 Access используется VBA7. Но он так же может исполнять программы, написанные в VBA6.

И вот мне просто стало интересно. Есть задача, в которой не используется API. И есть Access 2010 (2013, 2016) 32-бита. Он эту задачу будет выполнять в режиме VBA7 или VBA6?

Слово PtrSafe чётко указывает на использование VBA7. А если нет такого четкого указания в программе? Программа будет выполняться в режиме VBA7?
...
Рейтинг: 0 / 0
Как определить, в чём работает программа: VBA6 или VBA7?
    #39647421
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может и нет никакого различия для 32-х разрядных программ между VBA6 и VBA7 ,
Но в MSDN прописано следующее ветвление
Код: vbnet
1.
2.
3.
4.
5.
   #IF VBA7 THEN
      ...
   #ELSE
      ...
   #END IF

Значит это для чего-то нужно?
...
Рейтинг: 0 / 0
Как определить, в чём работает программа: VBA6 или VBA7?
    #39647428
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Joss...в которой не используется API... Программа будет выполняться в режиме VBA7?Причём тут API? Среда не зависит от наличия или отсутствия API. Кроме PtrSafe там ещё есть различия, всех не помню, но появляются, например, новые типы - LongLong . И тут не прокатит, как многие обычно делают, приведение типов по умолчанию. Так что используй условную компиляцию. Кстати её можно использовать не только в разделе декларации модуля, но и в других частях - объявление процедуры/функции, области декларации внутри исполняемого кода и просто в коде.
...
Рейтинг: 0 / 0
Как определить, в чём работает программа: VBA6 или VBA7?
    #39647430
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот нашел интересную информацию в MSDN. Может кого-то заинтересует.

В предыдущих версиях VBA не было определенного типа данных указателя, поэтому использовался тип Long. Так как тип данных Long всегда 32-разрядный, при использовании в системе с 64-разрядной памятью старшие 32 разряда могут усекаться, или запись может происходить в другие адреса памяти. Обе этих ситуации могут привести к непредвиденному поведению или сбою системы.

Чтобы устранить эту проблему, в VBA теперь есть настоящий тип данных указателя: LongPtr. Этот новый тип данных позволяет записывать оператор Declare правильно:

VBA
Код: vbnet
1.
2.
Declare PtrSafe Function RegOpenKeyA Lib "advapire32.dll" (ByVal hKey as LongPtr, _
                      ByVal lpSubKey As String, phkResult As LongPtr) As Long


Этот тип данных и новый атрибут PtrSafe позволяют использовать оператор Declare в 32- и 64-разрядных системах. Атрибут PtrSafe показывает компилятору VBA, что оператор Declare предназначен для 64-разрядной версии Office 2010. Без этого атрибута при использовании оператора Declare в 64-разрядной системе возникнет ошибка компиляции. Обратите внимание, что атрибут PtrSafe в 32-разрядной версии Office 2010 необязателен. Это позволяет существующим операторам Declare работать как обычно.
...
Рейтинг: 0 / 0
Как определить, в чём работает программа: VBA6 или VBA7?
    #39647431
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JossА может и нет никакого различия для 32-х разрядных программ между VBA6 и VBA7Насколько мне помнится практически нет.
...
Рейтинг: 0 / 0
Как определить, в чём работает программа: VBA6 или VBA7?
    #39647434
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Joss, да не парься ты по этому поводу. ЕМНИП, всё одно код скомпилированный в одной разрядности не будет работать в другой без перекомпилирования.
Могу ошибаться...
...
Рейтинг: 0 / 0
Как определить, в чём работает программа: VBA6 или VBA7?
    #39647442
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПанургJoss...в которой не используется API... Программа будет выполняться в режиме VBA7?Причём тут API? Среда не зависит от наличия или отсутствия API. Кроме PtrSafe там ещё есть различия, всех не помню, но появляются, например, новые типы - LongLong . И тут не прокатит, как многие обычно делают, приведение типов по умолчанию. Так что используй условную компиляцию. Кстати её можно использовать не только в разделе декларации модуля, но и в других частях - объявление процедуры/функции, области декларации внутри исполняемого кода и просто в коде.
Понедельник - день тяжелый. Неправильно заданный вопрос, неудачно сформулированная мысль.

Ну тип LongLong - это только для 64-х разрядных систем.
А вот новый тип LongPtr который может менять свой размер в зависимости от разрядности компилятора. Это только VBA7. Используется для указателей. Обеспечивает совместимость между 32-х и 64-х разрядными версиями. И вот его как раз и надо прописывать в операторах условной компиляции если хочешь, чтоб твоя программа работала так же и на Access 2003, 2007.

Я у себя всегда прописываю описание и для WIN64 / WIN32 и для VBA7 / VBA6. Так что программы работают на всём, что есть.
Можно конечно прописать всего 2 варианта, а не 3 (как у меня): WIN64 + VBA7 и VBA6

To Панург

Вот и различие для 32-х разрядных программ между VBA6 и VBA7. Использование нового типа данных -: LongPtr
...
Рейтинг: 0 / 0
Как определить, в чём работает программа: VBA6 или VBA7?
    #39647454
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подобью итог.

В Access 2010 и выше программа всегда выполняется в среде VBA7 (что правильно). Просто принятые умолчания для 32-х разрядной версии совпадают с требованиями VBA6.

1. Атрибут PtrSafe в 32-разрядной версии Office 2010 (и выше) необязателен
2. Тип LongPtr в 32-разрядной версии Office 2010 (и выше) может быть заменён на тип Long
...
Рейтинг: 0 / 0
Как определить, в чём работает программа: VBA6 или VBA7?
    #39647460
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JossПонедельник - день тяжелый.Кому как...
Я не очень понимаю чего ты хочешь?
Я тебе про это (для перфекционистов) для примера
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 
   #IF VBA7 THEN
     #if Win64 then 
         Function NameFunction() as LongLong
     #else 
         Function NameFunction() as LongPtr
     #end if 
   #ELSE
      Function NameFunction() as Long
   #END IF
     NameFunction=Application.hWndAccessApp 'хотя для 64битных там по моему другая
End Function 
...
Рейтинг: 0 / 0
Как определить, в чём работает программа: VBA6 или VBA7?
    #39647476
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПанургJoss, да не парься ты по этому поводу. ЕМНИП, всё одно код скомпилированный в одной разрядности не будет работать в другой без перекомпилирования.
Могу ошибаться... Меня это заинтересовало чисто теоретически. Ну и для лучшего понимания внутренней кухни.

Кстати. Если только у тебя базы не формата MDE или ACCDE, то перекомпиляция на другую разрядность происходит автоматически, при запуске программы на выполнение. (по крайней мере так было у меня)
...
Рейтинг: 0 / 0
Как определить, в чём работает программа: VBA6 или VBA7?
    #39647487
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПанургЯ не очень понимаю чего ты хочешь?

Ну я в выводах всё уже написал.

Понял, что в Access 2010 и выше компиляция всегда идёт в среде VBA7. А использовать программы на VBA6 без переделок в Access 2010 и выше можно потому, что синтаксис 32-х разрядной версии VBA7 и VBA6 совпадают.
Всё.
...
Рейтинг: 0 / 0
Как определить, в чём работает программа: VBA6 или VBA7?
    #39647490
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JossПанургJoss, да не парься ты по этому поводу. ЕМНИП, всё одно код скомпилированный в одной разрядности не будет работать в другой без перекомпилирования.
Могу ошибаться... Меня это заинтересовало чисто теоретически. Ну и для лучшего понимания внутренней кухни.

Кстати. Если только у тебя базы не формата MDE или ACCDE, то перекомпиляция на другую разрядность происходит автоматически, при запуске программы на выполнение. (по крайней мере так было у меня)С 64битным офисом не имел дела, упражнялся на других 64битных приложениях с VBA.
...
Рейтинг: 0 / 0
Как определить, в чём работает программа: VBA6 или VBA7?
    #39648092
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПанургJoss, да не парься ты по этому поводу. ЕМНИП, всё одно код скомпилированный в одной разрядности не будет работать в другой без перекомпилирования.
Могу ошибаться...

У меня такая ситуация сейчас. aacde
Правда параллельно.
Т.е. Помимо ошибки, что это приложение вин32
еще на вин7/64 + MS 2016 отказалась работать GetOpenFiles, правда на конкретном компе.
Просто завершается пустой строкой и все, даже окно не открывается.
...
Рейтинг: 0 / 0
Как определить, в чём работает программа: VBA6 или VBA7?
    #39648118
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если только на одном компе, значит там нет нужной библиотеки. Кажется comdlg32.dll.
...
Рейтинг: 0 / 0
Как определить, в чём работает программа: VBA6 или VBA7?
    #39648179
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Joss,

есть, смотрел в облаке, это как бы известная проблема....
доберусь буду биться
перекомпИлиться не проблема, проблема заставить API работать..
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как определить, в чём работает программа: VBA6 или VBA7?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]