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

ADN Club => ObjectARX => Тема начата: gudronov от 12-04-2014, 12:36:23

Название: .ARX в качестве загрузки сторонних DLL
Отправлено: gudronov от 12-04-2014, 12:36:23
Делаю простейший "родной" .arx, при инициализации загружаю DLL (loadlibrary), написанный на Delphi. Захватываю произвольные точки входа, по Invoke зову основной обработчик, по Loaddwg делаю Defun. Использую базу, Interbase. Все работает прекрасно, пока по причине ошибки IB (нет базы, невозможно удалить запись по причине ограничений FK-PK и т.д.) не возникает "мягкое" исключение в делфяровской DLL. Результат - по завершении кад не выгружается из памяти. Использую исключительно готовые классы в виде TIBInterbase, TIBTransaction, TIBSQL, больше никаких. Подозреваю, что надобно опускаться до уровня API, пока не пробовал. Основная версия када - 2002, на ней это и творится. Eсли несложно, выскажите свои соображения.
Название: Re: .ARX в качестве загрузки сторонних DLL
Отправлено: Александр Ривилис от 12-04-2014, 17:13:25
1) Ничего не увидел по поводу FreeLibrary
2) Ничего не знаю про Delphi
3) Происходит ли освобождение ресурсов при возникновении исключения?
4) Возможно ошибки в стандартных классах.
5) Переключаешь ли ресурсы на Delphi-dll во время выполнения кода из неё и возвращаешь ли их обратно?
6) На каждый CreateInstance должен быть Release
Вопросов может быть масса.
Напомню, что AutoCAD 2002 уже десять лет как не поддерживается, а связка ObjectARX-Delphi не поддерживалась никогда.

P.S.: Приветствую на форуме!  :)
Название: Re: .ARX в качестве загрузки сторонних DLL
Отправлено: gudronov от 12-04-2014, 22:53:34
1) Ничего не увидел по поводу FreeLibrary
  По финализации .arx, выгружаю по handle.
2) Ничего не знаю про Delphi
  Delphi XE.
3) Происходит ли освобождение ресурсов при возникновении исключения?
  Не возникает.
4) Возможно ошибки в стандартных классах.
  Не знаю, не отлаживал, потому и точу зуб на API. Исключение, вроде "мягенькое"... Так просто ошибка сервера БД проскакивает. Кстати, SMP2009.
5) Переключаешь ли ресурсы на Delphi-dll во время выполнения кода из неё и возвращаешь ли их обратно?
  Вот тут можно поподробнее? Я, собственно, последний раз такие выверты делал сто лет назад по кадом 14... 
6) На каждый CreateInstance должен быть Release
  Не скажу, механизма в совершенстве не знаю.
Вопросов может быть масса.
Напомню, что AutoCAD 2002 уже десять лет как не поддерживается, а связка ObjectARX-Delphi не поддерживалась никогда.
  Да вот, придется все равно покупать последнюю версию, ................, но ребята привыкли работать в интерфейсе 2002.

P.S. Просто примитивов я там творю - LWPOLYLINE, POINT, IMAGE командой, TEXT. Все.
P.P.S. Спасибо, что откликнулись, протестирую под еще всеми устонавившиемися версиями када, отпишусь дня через 2. Системы покупные вплоть до server 2012.

Off: был рад Вас услышать.

Сообщение почистил. Перечитай правила форума /* Александр Ривилис */
Название: Re: .ARX в качестве загрузки сторонних DLL
Отправлено: Александр Ривилис от 13-04-2014, 00:33:12
Вот тут можно поподробнее? Я, собственно, последний раз такие выверты делал сто лет назад по кадом 14... 
http://adn-cis.org/mfc-problemyi-s-cacmoduleresourceoverride.html
3) Происходит ли освобождение ресурсов при возникновении исключения?
  Не возникает.
Не понял.
Название: Re: .ARX в качестве загрузки сторонних DLL
Отправлено: gudronov от 14-04-2014, 13:27:07
Спасибо, насчет ресурсов стало понятно. Однако, я, похоже, всех ввел в заблуждение. Нужно было первым делом проверить выгрузку моих DLL при arxunload. Только сейчас заметил: FreeLibrary отрабатывает (финализация DLL проходит), а вот обратно в .arx управление не приходит. Так что это 99% не из за автокада, а из-за моих не очень прямых рук, буду отлаживаться дальше. Но за советы спасибо, кой-чего я не знал...
Название: Re: .ARX в качестве загрузки сторонних DLL
Отправлено: Dziubyna от 13-06-2014, 12:20:32
Здравствуйте, Александр Ривилис, хотел спросить на счет загрузки dll написанных на С#.
У меня есть arx с которого я подгружаю свои dbx и dll написанных на С++, также у меня есть написанный CSharp Plugin для AutoCAD. Если его просто подгружать через "netload" то все нормально, при загрузке модуля входит в точку "void IExtensionApplication.Initialize()".
Можно ли сделать такую загрузку с кода С++ (чтобы проходило метод "void IExtensionApplication.Initialize()")? или нужно вызывать код AutoLISP? пробовал LoadLibrary, acrxLoadApp... не получается.

За ранее благодарен за ответ.
Название: Re: .ARX в качестве загрузки сторонних DLL
Отправлено: Александр Ривилис от 13-06-2014, 12:43:07
Это возможно и достаточно просто. И об этом уже написано у нас на сайте:
Как загрузить из неуправляемого arx-приложения управляемую .NET сборку в AutoCAD? (http://adn-cis.org/kak-zagruzit-iz-neupravlyaemogo-arx-prilozheniya-upravlyaemuyu-.net-sborku-v-autocad.html)
Загрузка управляемой .NET сборки из ObjectARX приложения (http://adn-cis.org/zagruzka-upravlyaemoj-.net-sborki-iz-objectarx-prilozheniya.html)
Название: Re: .ARX в качестве загрузки сторонних DLL
Отправлено: Александр Ривилис от 14-06-2014, 02:24:58
Добавил проект для AutoCAD 2014.
Есть несколько нюансов:
1. Несколько разное определение функции LoadManagedDll для x64 и x86:
Код - C++ [Выбрать]
  1. #ifdef _WIN64
  2. enum Acad::ErrorStatus __cdecl LoadManagedDll(ACHAR const *);
  3. #else
  4. enum Acad::ErrorStatus __stdcall LoadManagedDll(ACHAR const *);
  5. #endif
2. Чтобы не забывать подключать библиотеку acdbmgd.lib удобно использовать #pragma:
Код - C++ [Выбрать]
  1. #pragma comment(lib,"acdbmgd.lib")
3. В AutoCAD 2014 встроена защита от загрузки приложений. Немного об этом здесь: http://adn-cis.org/autocad-2014-dlya-razrabotchikov.html
Функция LoadManagedDll следует этой защите, т.е. в зависимости от того где находится .NET-сборка и какое значение системной переменной SECURELOAD сборка может быть:
a) загружена без предупреждений (если или SECURELOAD = 0, или сборка находится в одном из каталогов, указанных в TRUSTEDPATHS)
b) появится запрос разрешения загрузки (если SECURELOAD = 1, и сборка не находится в одном из каталогов, указанных в TRUSTEDPATHS)
c) сборка не будет загружена (если SECURELOAD = 2, и сборка не находится в одном из каталогов, указанных в TRUSTEDPATHS)