Сообщество программистов Autodesk в СНГ

ADN Club => VBA => Тема начата: Gektor от 01-07-2013, 10:45:06

Название: VBA и 64-битный AutoCAD 2008-2013
Отправлено: Gektor от 01-07-2013, 10:45:06
Здравствуйте!
В 64-битных версиях AutoCAD 2008-2013 мы столкнулись со следующей проблемой:
Если была запущена программа на VBA, то при выходе из AutoCAD (либо при применении команды VBAUNLOAD) появляется запрос о сохранении изменений в VBA-проект.
Если на запрос ответить "Да", то сообщение больше не появляется, но при переходе на другую версию AutoCAD (например, с 2011 на 2013) возможно возникновение проблем (сообщения об ошибках, неадекватная реакция на действия пользователя и т.п.), не позволяющих нормально пользоваться данной программой.

Исследование показало, что AutoCAD пытается включить в проект VBA библиотеку типов (type library) текущей версии AutoCAD. Наличие в проекте ссылки на конкретную библиотеку типов препятствует нормальной работе программы при переходе в другую версию AutoCAD. В 32-битном AutoCAD такой проблемы не наблюдается. Ссылки на библиотеку типов не пытаются привязаться "намертво" к конкретной версии AutoCAD.

Есть ли способ решения данной проблемы?
Рекомендация AutoDesk о переходе на "нормальные" средства разработки нам известна, но, к сожалению, единомоменто в полном объеме осуществить данный переход невозможно.

Название: Re: VBA и 64-битный AutoCAD 2008-2013
Отправлено: Александр Ривилис от 01-07-2013, 15:57:41
Необходимы уточнения. Речь идёт только о 64-битных версиях AutoCAD? Описанный переход с версии 2011 на версию 2013 касается только x64? Или переход с 2011 x86 к 2013 x64 приводит к тем же результатам? Зависит ли это поведение от VBA-кода или такое происходит даже на самом простом проекте?

Я к сожалению не могу проверить у себя этот факт, т.к. версии x64 у меня не установлены. В связи с тем, что Microsoft не поддерживала VBA в среде x64, сотрудники Autodesk «героическими усилиями» сделали эту поддержку самостоятельно, используя межпроцессное взаимодействие, в связи с чем часть функций/методов попросту не работает, часть работает на порядок медленнее, чем в x86 (это не касается версии AutoCAD 2014).

Объектная модель от версии к версии претерпевает изменения и поэтому гарантировать работоспособность VBA-модуля во всей указанной линейке AutoCAD вряд ли удастся. Как вариант решения проблемы возможно наличие VBA-модулей для каждой из версий AutoCAD (или для линейки из трёх версий).

Чтобы не появлялось сообщение о сохранении VBA-проекта можно попробовать сделать хук на это диалоговое окно. Это делается средствами ObjectARX (с использованием Windows API) под линейку из трёх версий AutoCAD, отдельно для x86, отдельно для x64.

Ну и конечно совет о портировании приложения с платформы VBA на .NET самый правильный и актуальный.

P.S.: Я могу передать этот вопрос в ADN DevHelp, если Вы подготовите 100% воспроизводимый тест, с скриншотами, описанием и т.д. И не забудьте, что ответы от DevHelp только на последние три версии AutoCAD.
Название: Re: VBA и 64-битный AutoCAD 2008-2013
Отправлено: Алексей Кулик от 01-07-2013, 16:07:56
Не видя кода, тяжело что-либо советовать.

Повторяется ли ситуация, если DVB-проект загрузить в "пустой" профиль AutoCAD? Может быть, будет иметь смысл отключить автоматически загружаемые модули (кажется, имя файла должно быть наподобие acad.dvb и лежать он должен в путях поддержки)?
Повторяется ли ситуация, если сначала принудительно в файле dwg удалить записи о словарях VBA, а потом уже принудительно загрузить dvb-модуль?
Название: Re: VBA и 64-битный AutoCAD 2008-2013
Отправлено: Gektor от 01-07-2013, 17:14:12
Необходимы уточнения. Речь идёт только о 64-битных версиях AutoCAD? Описанный переход с версии 2011 на версию 2013 касается только x64? Или переход с 2011 x86 к 2013 x64 приводит к тем же результатам? Зависит ли это поведение от VBA-кода или такое происходит даже на самом простом проекте?

Да, речь идет только о 64-битных версиях AutoCAD (кроме 2014). Описанный переход касается только х64. Переход с любой х86 на любую х64 проходит нормально, за исключением запроса о сохранении проекта, в результате которого "все ломается". Поведение наблюдается во всех, даже простых проектах которые мне доступны. Насколько я могу судить, проблема возникает только при обращении к чертежу, т.е. если просто вызвать и сразу же закрыть диалоговое окно запроса может и не быть.

Повторяется ли ситуация, если DVB-проект загрузить в "пустой" профиль AutoCAD? Может быть, будет иметь смысл отключить автоматически загружаемые модули (кажется, имя файла должно быть наподобие acad.dvb и лежать он должен в путях поддержки)?

Повторяется при любом профиле на любой машине. Все dvb-модули загружаются принудительно.

Повторяется ли ситуация, если сначала принудительно в файле dwg удалить записи о словарях VBA, а потом уже принудительно загрузить dvb-модуль?

Разве в новом чертеже есть какие-то записи о VBA? Штатные средства ("Диспетчер VBA") ничего не показывают.

P.S.: Я могу передать этот вопрос в ADN DevHelp, если Вы подготовите 100% воспроизводимый тест, с скриншотами, описанием и т.д. И не забудьте, что ответы от DevHelp только на последние три версии AutoCAD.

Попробую сделать чистый тестовый пример и испытать на нем. О результатах сообщу в этой же теме.
Название: Re: VBA и 64-битный AutoCAD 2008-2013
Отправлено: Алексей Кулик от 01-07-2013, 17:28:38
Разве в новом чертеже есть какие-то записи о VBA? Штатные средства ("Диспетчер VBA") ничего не показывают.
Эти средства и не покажут. Тем не менее записи в соответствующем словаре могут присутствовать.
P.S. В общем и целом поддерживаю Александра во мнении:
Как вариант решения проблемы возможно наличие VBA-модулей для каждой из версий AutoCAD (или для линейки из трёх версий).
Название: Re: VBA и 64-битный AutoCAD 2008-2013
Отправлено: Gektor от 03-07-2013, 10:02:02
Я могу передать этот вопрос в ADN DevHelp, если Вы подготовите 100% воспроизводимый тест, с скриншотами, описанием и т.д. И не забудьте, что ответы от DevHelp только на последние три версии AutoCAD.

Как и обещал, сделал тестовое приложение и подробное описание проблемы со скриншотами. Надеюсь, оно годится для отправки в ADN DevHelp.

Во вложении находится zip-архив с двумя файлами проекта - один исходный, созданный в 32-битной версии AutoCAD (TestVBA), второй - сохранен в 64-битной версии AutoCAD 2012 (TestVBA(sav2012_64)).

Описание тестового приложения:
Тестовое приложение состоит из кнопки Draw Polyline и текстового поля Polyline Area. При нажатии на кнопку Draw Polyline в командной строке появляется последовательность запросов точек - вершин полилинии. Построенная по указанным точкам полилиния автоматически замыкается и в поле Polyline Area отображается площадь полилинии.

Описание проблемы:
Проект, созданный в 32 битной версии AutoCAD без проблем загружается и работает в любой версии AutoCAD, любой разрядности. При этом в 64-разрядных версиях AutoCAD (кроме 2014) при выгрузке проекта (либо закрытии AutoCAD) возникает запрос о сохранении изменений.

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs22.postimg.org%2Fb2i9lpau5%2Fsave.jpg&hash=8c2ade5c4b6150c5663c64ee598c37a5) (http://postimg.org/image/b2i9lpau5/)

Если выбрать вариант ответа "Да", то проект "привязывается" к конкретной библиотеке типов.
Так, файл сохраненный в версии AutoCAD 2012 корректно работает на той же машине и с версиями AutoCAD 2010-2011.
При переходе на версию 2013 тестовое приложение начинает работать некорректно: Полилиния строится только по двум первым точкам, остальные указанные пользователем точки игнорируются. В реальных проектах могут наблюдаться и другие ошибки (например сообщение о несовпадении типов при обращении к объектам чертежа).

В случае, если конкретная библиотека типов (в данном случае AutoCAD 2012 Type Library) отсутствует, то при попытке обращения к объектной модели AutoCAD выдается сообщение о невозможности найти библиотеку.

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs14.postimg.org%2Fhskf7uoyl%2Ferror32.jpg&hash=be5c6dc3b9145605cfe669a8c7e714a3) (http://postimg.org/image/hskf7uoyl/)

В случае перехода на 32-битную версию данное сообщение возникает даже в "правильном" AutoCAD (в случае тестового приложения - AutoCAD 2012).
Если открыть пункт меню VBA IDE Tools ->References, то можно увидеть потерянную библиотеку типов.

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs21.postimg.org%2Fdg162z4r7%2Ferror_Type_Lib.jpg&hash=a3a36882c764f9a1c19bd521d015524f) (http://postimg.org/image/dg162z4r7/)

Замечание: Tools -> References мне удавалось открыть только в 32-битных версиях AutoCAD. В 64-битных версиях при попытке открыть данный пункт меню, AutoCAD закрывался с ошибкой.

Вопрос:
Существуют ли иные способы обойти данную проблему, кроме создания отдельного проекта для каждой из 64-битных версий AutoCAD?
Название: Re: VBA и 64-битный AutoCAD 2008-2013
Отправлено: Алексей Кулик от 03-07-2013, 22:32:21
Описание ошибки отправлено в ADN DevHelp.
Название: Re: VBA и 64-битный AutoCAD 2008-2013
Отправлено: Алексей Кулик от 09-07-2013, 09:12:12
Получен ответ (привожу перевод; оригинал могу отправить Вам в ЛС, если это необходимо):
Цитировать
VBA - старая технология, которая фактически зависит от версии AutoCAD и (начиная с версии 2014) - еще и от разрядности. Причина подобного поведения кроется в том, что VBA модуль, реализованный Autodesk, помещается в отдельный процесс.
К сожалению, невозможно предложить другой путь, кроме как создавать отдельные модули для 32- и 64-разрядных версий AutoCAD. Можно создать .NET-модуль, который определяет разрядность AutoCAD и загружает соответствующий VBA-модуль.
Мое личное мнение: попытки использования VBA-модулей на данный момент, скорее всего - временное решение. Я бы попробовал постепенно переводить все на .NET-технологии, благо на официальном сайте Autodesk были уроки, показывающие, как переводить VBA-проекты в VB.NET. Аналогичная информация есть и на AutoCAD .NET Developer's Guide (http://www.autodesk.com/autocad-net-developers-guide)
---
P.S. Пожалуйста, сообщите - удовлетворителен ли ответ или надо будет что-то дополнять. Если все хорошо, то тогда я закрою case. Если нет - то будем дальше "терроризировать" ADN.
Название: Re: VBA и 64-битный AutoCAD 2008-2013
Отправлено: Gektor от 09-07-2013, 10:22:14
Мое личное мнение: попытки использования VBA-модулей на данный момент, скорее всего - временное решение. Я бы попробовал постепенно переводить все на .NET-технологии, благо на официальном сайте Autodesk были уроки, показывающие, как переводить VBA-проекты в VB.NET. Аналогичная информация есть и на AutoCAD .NET Developer's Guide (http://www.autodesk.com/autocad-net-developers-guide)
---
P.S. Пожалуйста, сообщите - удовлетворителен ли ответ или надо будет что-то дополнять. Если все хорошо, то тогда я закрою case. Если нет - то будем дальше "терроризировать" ADN.

VBA - это наработанное за многие годы. :)
Мы сейчас постепенно уходим от VBA, но переработать все в короткие сроки не можем. Нам просто нужно было уточнить, есть ли обходные пути.
Ответ полностью устраивает, закрывайте case.
Большое спасибо за помощь!
Название: Re: VBA и 64-битный AutoCAD 2008-2013
Отправлено: Алексей Кулик от 09-07-2013, 10:39:32
Case закрыт, тему предлагаю оставить в живом варианте - мало ли...