|
|||||||
Access. Переход с 32-х разрядной версии офиса на 64-х разрядную.
Время создания: 16.03.2019 23:43
Раздел: Разные закладки - VBA - Access
Запись: xintrea/mytetra_db_adgaver_new/master/base/15332460144wkrmvi4sq/text.html на raw.githubusercontent.com
|
|||||||
|
|||||||
Access. Переход с 32-х разрядной версии офиса на 64-х разрядную.
(обращений: 1950 с 28.04.2016)
Разделы: Статьи
Описание: Проблемы, связанные с переходом на 64-х битную версию и пути их решения. Пошарился по интернету, по форумам. Попробовал свести всё в одно место. Версия 1.1 от 20.05.2018
Автор: Дмитрий Сонных (AKA Joss)
Добавил на сайт: Профиль пользователяJoss 28.04.2016
Скачать: Win32API_PtrSafe.rar (105721 байт) (скачиваний: 167 с 28.04.2016) Пошарился по интернету, по форумам. Попробовал свести всё в одно место.
Access. Переход с 32-х разрядной версии офиса на 64-х разрядную.
Начиная с версии Office 2010, офис стал выпускаться в двух вариантах 32-х разрядный и 64-х разрядный. Причём, если 32-х разрядный офис может спокойно устанавливаться как на 32-х, так и на 64-х разрядную системы, то 64-х разрядный офис может ставиться только на 64-х разрядную операционку.
Хотя 32-разрядные приложения могут работать прозрачно, смешивание двух типов кода в одном процессе не поддерживается. 64-разрядное приложение не может подключаться к 32-разрядной системной библиотеке (DLL); аналогичным образом 32-разрядное приложение не может подключаться к 64-разрядной системной библиотеке.
ВНИМАНИЕ! При попытке запустить 32-разрядный код в 64-разрядной версии Access возникнут ошибки времени выполнения. Например, из-за несоответствия версий пользовательского приложения (32-разрядный код) и одного из 64-разрядных поставщиков ACE, установленных с 64-разрядной версией Microsoft Access, может возникнуть ошибка "Поставщик Microsoft.ACE.OLEDB.12.0 не зарегистрирован на локальном компьютере". Чтобы устранить эту проблему, либо обновите пользовательский код до 64-разрядной версии, либо удалите 64-разрядную версию Access и установите 32-разрядную.
Параллельная установка 64-х и 32-х разрядных выпусков Office 2010 не поддерживается. Это относится и к Access.
Перед развертыванием 64-разрядной версии Access определите, подходит ли такой вариант развертывания для конкретной среды. На совместимость с текущим 32-разрядным решением для Access влияет ряд факторов. Например, при использовании баз данных с удаленным исходным кодом (MDE-, ADE- и ACCDE-файлов) либо при использовании VBA-кода с операторами Declare, надстройками COM и элементами ActiveX необходимо приложить определенные усилия, чтобы эти функции заработали с 64-разрядной версией Access. Для устранения этой проблемы также можно установить 32-разрядную версию Access в 32-разрядной версии Windows либо 32-разрядную версию Access (WOW64) в 64-разрядной версии Windows.
Если Вы собираетесь использовать 64-х разрядные базы данных Access, и в будущем ситуация не изменится, самым естественным вариантом для работы с данными будет выбор драйвера ACE DAO, поскольку он предоставляет наиболее полный набор функций. В конце концов, собственные технологии доступа к данным, как правило, позволяют сократить время разработки, упростить код и обеспечить более высокую производительность. Если будут использоваться расширенные возможности работы с наборами данных и подключения к вспомогательным внешним источникам, рассмотрите возможность использования ADO.NET (или ADO) либо OLE DB. Полную поддержку устаревших возможностей, таких как связанные таблицы и сохраненные запросы, а также новых сложных типов данных, появившихся в Access 2007, обеспечивает только драйвер ACE DAO. Драйвер ACE OLE DB обеспечивает ограниченную поддержку сложных данных. Например, для более эффективной поддержки сложного набора данных (для извлечения наборов записей в наборах данных) необходимо задать параметр подключения "JET OLE DB: Support Complex Data". Если этого не сделать, по умолчанию для сложных полей будут возвращаться списки разделенных значений. Технологии ADO.NET, ADO и ACE ODBC всегда возвращают для сложных полей списки разделенных значений.
Выполнение кода VBA, который был написан до выпуска Office 2010 (VBA версии 6 и более ранних версий), на 64-разрядной платформе может приводить к возникновению ошибок, если код не был модифицирован для работы в 64-разрядных версиях Office. Ошибки будут возникать по той причине, что язык VBA версии 6 и более ранних версий неявно ориентирован на 32-разрядные платформы и обычно содержит операторы объявления, которые запускают в действие функции API Microsoft Windows, использующие 32-разрядные типы данных для указателей и дескрипторов. Так как язык VBA версии 6 и более ранних версий не имеет специального типа данных для указателей и дескрипторов, им используется тип данных Long, который является 32-разрядным 4-байтным типом данных, предназначенным для ссылки на указатели и дескрипторы. Указатели и дескрипторы в 64-разрядных средах являются 8-байтными 64-разрядными числами. Эти 64-разрядные числа не могут храниться в 32-разрядных типах данных.
Проблема с выполнением унаследованного программного кода VBA в 64-разрядном пакете Office заключается в том, что при попытке загрузить 64-разрядные значения в 32-разрядный тип данных 64-разрядные числа усекаются. Это может приводить к переполнениям памяти, неожиданным результатам в коде и возможным сбоям приложения.
Для устранения этой проблемы и обеспечения правильной работы кода VBA как в 32-разрядных, так и в 64-разрядных средах в язык VBA добавлен ряд функциональных возможностей. Три важных добавления: псевдоним типа LongPtr, тип данных LongLong и ключевое слово PtrSafe.
LongPtr — теперь язык VBA включает псевдоним типа переменной: LongPtr. Фактический тип данных, в который разрешается тип LongPtr, зависит от версии пакета Office, в котором он используется: тип LongPtr разрешается в тип Long в 32-разрядных пакетах Office, и тип LongPtr разрешается в тип LongLong в 64-разрядных версиях пакета Office. Используйте тип LongPtr для указателей и дескрипторов.
LongLong — тип данных LongLong — это 64-разрядные целые числа со знаком, которые доступны только в 64-разрядных версиях пакета Office. Используйте тип LongLong для 64-разрядных целых чисел. Для явного присвоения значений типа LongLong (включая тип LongPtr на 64-разрядных платформах) целочисленным типам данных меньшего размера должны использоваться функции преобразования. Неявное преобразование типа LongLong в целочисленные данные меньшего размера не допускается.
PtrSafe — ключевое слово PtrSafe декларирует, что оператор Declare безотказно выполняется в 64-разрядных версиях пакета Office.
Теперь все операторы Declare должны содержать ключевое слово PtrSafe, когда выполняются в 64-х разрядных версиях пакета Office. Для 32-х разрядных версий это не обязательно. Важно понимать, что просто добавление ключевого слова PtrSafe в оператор Declare означает только, что оператор Declare явно ориентирован на 64-разрядные данные, все типы данных в операторе, которые предназначены для хранения 64 разрядов (включая возвращаемые значения и параметры), все еще нуждаются в изменении, чтобы хранить 64-разрядные числа.
Начиная с Access 2010 для программирования стал доступен VBA 7.
VBA 7 — это новая база кода, которая заменяет предыдущую версию VBA. Он предоставляет две константы условной компиляции: VBA7 и Win64. Константа VBA7 обеспечивает обратную совместимость кода, проверяя, использует ли приложение VBA 7 или предыдущую версию VBA. Константа Win64 используется для проверки, выполняется ли код как 32-разрядный или 64-разрядный. Использование обеих этих констант компиляции показано далее.
Операторы Declare, содержащие слово PtrSafe, работают корректно в среде разработки VBA7 как на 32-разрядных, так и на 64 разрядных платформах. Чтобы обеспечить обратную совместимость в VBA 7 и более ранних версиях, используйте следующую структуру:
#If Vba7 Then Declare PtrSafe Sub... #Else Declare Sub... #EndIf
Примечание. Я писал текст программ в Access 2003, а уже потом отлаживал в Access 2010. В Access 2003 строки с этой переменной подсвечивались красным, но компилятор Access 2003 их спокойно обрабатывал. В Access 2010 наоборот подсвечивались строки без PtrSafe.
Пример не модифицированного унаследованного оператора Declare в языке VBA5/6 версий Access 97/2000/2002/2003/2007
Declare Function GetActiveWindow Lib "user32" () As Long
Пример оператора Declare языка VBA модифицированного для включения спецификатора PtrSafe, но по-прежнему используется 32-разрядное возвращаемое значение в языке VBA7 версий Access 2010/2013/2016
Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
Пример оператора Declare языка VBA, модифицированный для включения ключевого слова PtrSafe и обновленный для использования 64-разрядного типа данных (LongPtr)
Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
Итак, для правильной работы кода в 64-разрядных версиях пакета Office необходимо найти и модифицировать все существующие операторы Declare, чтобы они использовали спецификатор PtrSafe. А внутри этих операторов Declare необходимо найти и модифицировать все типы данных, которые ссылаются на дескрипторы или указатели, чтобы использовать псевдоним нового 64-разрядного совместимого типа LongPtr и типы, необходимые для хранения 64-разрядных целых чисел с новым типом данных LongLong. Кроме того, следует обновить все определенные пользователем типы, содержащие указатели или дескрипторы и 64-разрядные целые числа, чтобы использовать 64-разрядные типы данных, и убедиться в правильности присвоений всех переменных, чтобы предотвратить появление ошибок несоответствия типов.
Чтобы написать код, переносимый между 32-разрядными и 64-разрядными версиями Office, требуется лишь использовать для всех указателей и значений дескрипторов псевдоним нового типа LongPtr вместо типа Long (32-х разрядная версия) или LongLong(64-х разрядная версия). Псевдоним типа LongPtr разрешается в правильный тип данных Long или LongLong в зависимости от того, какая версия пакета Office используется. Обратите внимание, что если требуется реализовать другую логику, можно использовать константу условной компиляции Win64
Код с её использованием будет выглядеть следующим образом.
#if Win64 then ' Code is running in 64-bit version of Microsoft Office #else ' Code is running in 32-bit version of Microsoft Office #end if
Чтобы написать код, работоспособный как в новой, так и в старой версиях Office, можно использовать комбинацию новых условных констант компилятора VBA7 и Win64.
#if Vba7 then ' Code is running in the new VBA7 editor #if Win64 then ' Code is running in 64-bit version of Microsoft Office #else ' Code is running in 32-bit version of Microsoft Office #end if #else ' Code is running in VBA version 6 or earlier #end if
#If Vba7 Then Declare PtrSafe Sub... #Else Declare Sub... #EndIf
Дли типов данных LongPtr и LongLong не действует неявное преобразование типов, как для остальных типов данных.
В следующей таблице описывается новый квалификатор и тип данных, а также другой тип данных, два оператора преобразования и три функции.
----------------------------------------------------------------------------------------- Тип Элемент Описание -----------------------------------------------------------------------------------------
Квалификатор PtrSafe Обозначает, что оператор Declare совместим с 64-разрядными системами. Этот атрибут обязателен для 64-разрядных систем.
Тип данных LongPtr Тип данных переменной, состоящей из 4 байт в 32-разрядных версиях и из 8 байт в 64-разрядных версиях Office 2010. Это рекомендуемый способ объявления указателя или дескриптора в новом коде, а также в старом коде, если он будет выполняться в 64-разрядной версии Office 2010. Эта возможность поддерживается только в среде выполнения VBA 7 в 32- и 64-разрядных системах. Обратите внимание, что этой переменной можно назначать числовые значения, но не числовые типы.
Тип данных LongLong Это 8-байтовый тип данных, доступный только в 64-разрядных версиях Office 2010. Этому типу можно назначать числовые значения, но не числовые типы (чтобы избежать усечения).
Оператор CLngPtr Преобразует простое выражение в тип данных LongPtr. преобразования
Оператор CLngLng Преобразует простое выражение в тип данных LongLong. преобразования
Функция VarPtr Преобразователь вариантов. Возвращает тип LongPtr для 64-разрядных версий и тип Long для 32-разрядных версий (4 байта).
Функция ObjPtr Преобразователь объектов. Возвращает тип LongPtr для 64-разрядных версий и тип Long для 32-разрядных версий (4 байта).
Функция StrPtr Преобразователь строк. Возвращает тип LongPtr для 64-разрядных версий и тип Long для 32-разрядных версий (4 байта).
P.S. В приложенном файле Win32API_PtrSafe.txt даны декларации API функций для 64-х битной версии. Но не для всех API!. Остальные придётся декларировать самостоятельно. Деятели от MS считают, что пользователи с этим справятся.
[Back]
Текущий рейтинг: 0 из 5 (проголосовало:0).
Здравствуйте! Для участия в рейтинге необходимо залогиниться на сайт. Это сделано для того, чтобы более точно производить оценку статей (чтобы одному и тому же человеку было труднее голосовать несколько раз, портя тем самым статистику. Эта процедура очень быстрая и, надеюсь, Вас не затруднит :). Все мысли по поводу работы сайта всегда можно высказать на форуме! Вход на сайт
Обсуждение статьи: [Добавить комментарий] [Подписаться на комментарии к этой теме] Из опыта перехода. Профиль пользователяJoss [Пометить сообщение как непрочитанное] [Ответить] Переводил на 64-х битную версию небольшую программу написанную в Access 2000. Без ActivX и API. Что замечено. Если у Вас есть ссылка на библиотеку Microsoft DAO 3.6 Object Library , то замените её на Microsoft Office XX.X Access Database Engine Object Library, так как для 64-х разрядной версии не существует соответствующей 64-х разрядной библиотеки Microsoft DAO 3.6 Object Library 27.04.2016 18:56 (последнее изменение - 28.04.2016 10:26) [История изменения сообщения]
Насчет ядра Microsoft JET Профиль пользователяJoss [Пометить сообщение как непрочитанное] [Ответить] Что насчет ядра Microsoft JET?
До выпуска Access 2007 в Access использовалось ядро Microsoft Joint Engine Technology (JET). Хотя ядро JET обычно рассматривается как компонент Access, оно является отдельным продуктом. С момента выпуска Microsoft Windows 2000 ядро JET было включено в состав операционной системы Windows, после чего распространялось и обновлялось в составе компонентов Microsoft Data Access Components (MDAC). После выпуска Access 2007 ядро JET было признано устаревшим и было исключено из состава MDAC. Вместо этого ядра в Access теперь используется интегрированное и усовершенствованное ядро ACE, разработка которого началась с создания снимка исходного кода JET.
Ядро ACE полностью обратно совместимо с предыдущими версиями JET, что позволяет выполнять чтение и запись данных в MDB-файлы из предыдущих версий Access. Поскольку ядро теперь отдано группе разработчиков Access, другие разработчики могут быть уверены в том, что их решения для Access не только продолжат работать в будущем, но станут быстрее, надежнее и получат поддержку новых возможностей. Например, с выпуском Access 2010 в ядре ACE, в числе прочих усовершенствований, была реализована поддержка 64-разрядной версии и улучшена интеграция с технологиями и веб-службами SharePoint. Корпорация Microsoft обязуется поддерживать Access в качестве платформы разработки. 28.04.2016 10:31
Дополнение Профиль пользователяJoss [Пометить сообщение как непрочитанное] [Ответить] Учтите, что типы переменных/свойств в рекордсетах могут зависеть от разрядности версии Access. Например свойство RecordsetCount в 32-х разрядной версии имеет тип Long, а в 64-х разрядной - LongLong. Решить проблему универсальности программы можно при помощи операторов условной компиляции. Пример задания переменной для RecordsetCount
#if Vba7 then ' Code is running in the new VBA7 editor #if Win64 then ' Code is running in 64-bit version of Microsoft Office Dim i as LongLong #else ' Code is running in 32-bit version of Microsoft Office Dim i as Long #end if #else ' Code is running in VBA version 6 or earlier Dim i as Long #end if
Или вот так
#if Vba7 then ' Code is running in the new VBA7 editor Dim i as LongPtr #else ' Code is running in VBA version 6 or earlier Dim i as Long #end if
11.04.2018 12:58 (последнее изменение - 21.05.2018 12:25) [История изменения сообщения]
Немного о совместимость 32- и 64-разрядных версий Office Профиль пользователяJoss [Пометить сообщение как непрочитанное] [Ответить] В предыдущих версиях VBA не было определенного типа данных указателя, поэтому использовался тип Long. Так как тип данных Long всегда 32-разрядный, при использовании в системе с 64-разрядной памятью старшие 32 разряда могут усекаться, или запись может происходить в другие адреса памяти. Обе этих ситуации могут привести к непредвиденному поведению или сбою системы.
Чтобы устранить эту проблему, в VBA теперь есть настоящий тип данных указателя: LongPtr. Этот новый тип данных позволяет записывать оператор Declare правильно: VBA
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 работать как обычно.
Смотри MSDN - https://msdn.microsoft.com/ru-ru/library/office/ee691831(v=office.14).aspx 21.05.2018 12:38
|
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|