Сообщество программистов Autodesk в СНГ
ADN Club => VBA => Тема начата: 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 о переходе на "нормальные" средства разработки нам известна, но, к сожалению, единомоменто в полном объеме осуществить данный переход невозможно.
-
Необходимы уточнения. Речь идёт только о 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.
-
Не видя кода, тяжело что-либо советовать.
Повторяется ли ситуация, если DVB-проект загрузить в "пустой" профиль AutoCAD? Может быть, будет иметь смысл отключить автоматически загружаемые модули (кажется, имя файла должно быть наподобие acad.dvb и лежать он должен в путях поддержки)?
Повторяется ли ситуация, если сначала принудительно в файле dwg удалить записи о словарях VBA, а потом уже принудительно загрузить dvb-модуль?
-
Необходимы уточнения. Речь идёт только о 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.
Попробую сделать чистый тестовый пример и испытать на нем. О результатах сообщу в этой же теме.
-
Разве в новом чертеже есть какие-то записи о VBA? Штатные средства ("Диспетчер VBA") ничего не показывают.
Эти средства и не покажут. Тем не менее записи в соответствующем словаре могут присутствовать.
P.S. В общем и целом поддерживаю Александра во мнении:Как вариант решения проблемы возможно наличие VBA-модулей для каждой из версий AutoCAD (или для линейки из трёх версий).
-
Я могу передать этот вопрос в 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?
-
Описание ошибки отправлено в ADN DevHelp.
-
Получен ответ (привожу перевод; оригинал могу отправить Вам в ЛС, если это необходимо):
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.
-
Мое личное мнение: попытки использования 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.
Большое спасибо за помощь!
-
Case закрыт, тему предлагаю оставить в живом варианте - мало ли...