VBA и 64-битный AutoCAD 2008-2013

Автор Тема: VBA и 64-битный AutoCAD 2008-2013  (Прочитано 20082 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн GektorАвтор темы

  • ADN
  • *
  • Сообщений: 5
  • Карма: 0
    • НТЦ Гектор
VBA и 64-битный AutoCAD 2008-2013
« : 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 о переходе на "нормальные" средства разработки нам известна, но, к сожалению, единомоменто в полном объеме осуществить данный переход невозможно.


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: VBA и 64-битный AutoCAD 2008-2013
« Ответ #1 : 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.
« Последнее редактирование: 01-07-2013, 16:11:37 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: VBA и 64-битный AutoCAD 2008-2013
« Ответ #2 : 01-07-2013, 16:07:56 »
Не видя кода, тяжело что-либо советовать.

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

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн GektorАвтор темы

  • ADN
  • *
  • Сообщений: 5
  • Карма: 0
    • НТЦ Гектор
Re: VBA и 64-битный AutoCAD 2008-2013
« Ответ #3 : 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.

Попробую сделать чистый тестовый пример и испытать на нем. О результатах сообщу в этой же теме.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: VBA и 64-битный AutoCAD 2008-2013
« Ответ #4 : 01-07-2013, 17:28:38 »
Разве в новом чертеже есть какие-то записи о VBA? Штатные средства ("Диспетчер VBA") ничего не показывают.
Эти средства и не покажут. Тем не менее записи в соответствующем словаре могут присутствовать.
P.S. В общем и целом поддерживаю Александра во мнении:
Как вариант решения проблемы возможно наличие VBA-модулей для каждой из версий AutoCAD (или для линейки из трёх версий).
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн GektorАвтор темы

  • ADN
  • *
  • Сообщений: 5
  • Карма: 0
    • НТЦ Гектор
Re: VBA и 64-битный AutoCAD 2008-2013
« Ответ #5 : 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) возникает запрос о сохранении изменений.



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

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



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



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

Вопрос:
Существуют ли иные способы обойти данную проблему, кроме создания отдельного проекта для каждой из 64-битных версий AutoCAD?

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: VBA и 64-битный AutoCAD 2008-2013
« Ответ #6 : 03-07-2013, 22:32:21 »
Описание ошибки отправлено в ADN DevHelp.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: VBA и 64-битный AutoCAD 2008-2013
« Ответ #7 : 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
---
P.S. Пожалуйста, сообщите - удовлетворителен ли ответ или надо будет что-то дополнять. Если все хорошо, то тогда я закрою case. Если нет - то будем дальше "терроризировать" ADN.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн GektorАвтор темы

  • ADN
  • *
  • Сообщений: 5
  • Карма: 0
    • НТЦ Гектор
Re: VBA и 64-битный AutoCAD 2008-2013
« Ответ #8 : 09-07-2013, 10:22:14 »
Мое личное мнение: попытки использования VBA-модулей на данный момент, скорее всего - временное решение. Я бы попробовал постепенно переводить все на .NET-технологии, благо на официальном сайте Autodesk были уроки, показывающие, как переводить VBA-проекты в VB.NET. Аналогичная информация есть и на AutoCAD .NET Developer's Guide
---
P.S. Пожалуйста, сообщите - удовлетворителен ли ответ или надо будет что-то дополнять. Если все хорошо, то тогда я закрою case. Если нет - то будем дальше "терроризировать" ADN.

VBA - это наработанное за многие годы. :)
Мы сейчас постепенно уходим от VBA, но переработать все в короткие сроки не можем. Нам просто нужно было уточнить, есть ли обходные пути.
Ответ полностью устраивает, закрывайте case.
Большое спасибо за помощь!

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: VBA и 64-битный AutoCAD 2008-2013
« Ответ #9 : 09-07-2013, 10:39:32 »
Case закрыт, тему предлагаю оставить в живом варианте - мало ли...
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!