.ARX в качестве загрузки сторонних DLL

Автор Тема: .ARX в качестве загрузки сторонних DLL  (Прочитано 6796 раз)

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

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

  • ADN OPEN
  • Сообщений: 3
  • Карма: 0
Делаю простейший "родной" .arx, при инициализации загружаю DLL (loadlibrary), написанный на Delphi. Захватываю произвольные точки входа, по Invoke зову основной обработчик, по Loaddwg делаю Defun. Использую базу, Interbase. Все работает прекрасно, пока по причине ошибки IB (нет базы, невозможно удалить запись по причине ограничений FK-PK и т.д.) не возникает "мягкое" исключение в делфяровской DLL. Результат - по завершении кад не выгружается из памяти. Использую исключительно готовые классы в виде TIBInterbase, TIBTransaction, TIBSQL, больше никаких. Подозреваю, что надобно опускаться до уровня API, пока не пробовал. Основная версия када - 2002, на ней это и творится. Eсли несложно, выскажите свои соображения.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
1) Ничего не увидел по поводу FreeLibrary
2) Ничего не знаю про Delphi
3) Происходит ли освобождение ресурсов при возникновении исключения?
4) Возможно ошибки в стандартных классах.
5) Переключаешь ли ресурсы на Delphi-dll во время выполнения кода из неё и возвращаешь ли их обратно?
6) На каждый CreateInstance должен быть Release
Вопросов может быть масса.
Напомню, что AutoCAD 2002 уже десять лет как не поддерживается, а связка ObjectARX-Delphi не поддерживалась никогда.

P.S.: Приветствую на форуме!  :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 3
  • Карма: 0
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: был рад Вас услышать.

Сообщение почистил. Перечитай правила форума /* Александр Ривилис */
« Последнее редактирование: 13-04-2014, 00:29:31 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Вот тут можно поподробнее? Я, собственно, последний раз такие выверты делал сто лет назад по кадом 14... 
http://adn-cis.org/mfc-problemyi-s-cacmoduleresourceoverride.html
3) Происходит ли освобождение ресурсов при возникновении исключения?
  Не возникает.
Не понял.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 3
  • Карма: 0
Спасибо, насчет ресурсов стало понятно. Однако, я, похоже, всех ввел в заблуждение. Нужно было первым делом проверить выгрузку моих DLL при arxunload. Только сейчас заметил: FreeLibrary отрабатывает (финализация DLL проходит), а вот обратно в .arx управление не приходит. Так что это 99% не из за автокада, а из-за моих не очень прямых рук, буду отлаживаться дальше. Но за советы спасибо, кой-чего я не знал...

Оффлайн Dziubyna

  • ADN Club
  • Сообщений: 41
  • Карма: 4
  • Skype: andriy.dziubyna
Здравствуйте, Александр Ривилис, хотел спросить на счет загрузки dll написанных на С#.
У меня есть arx с которого я подгружаю свои dbx и dll написанных на С++, также у меня есть написанный CSharp Plugin для AutoCAD. Если его просто подгружать через "netload" то все нормально, при загрузке модуля входит в точку "void IExtensionApplication.Initialize()".
Можно ли сделать такую загрузку с кода С++ (чтобы проходило метод "void IExtensionApplication.Initialize()")? или нужно вызывать код AutoLISP? пробовал LoadLibrary, acrxLoadApp... не получается.

За ранее благодарен за ответ.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Добавил проект для 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)
« Последнее редактирование: 14-06-2014, 15:37:04 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение