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

09/09/2013

Использование ActiveX интерфейса AutoCAD при его завершении

Мы можем попробовать использовать в ObjectARX-приложении ActiveX интерфейс AutoCAD для установки пользовательского профиля при старте и завершении AutoCAD при помощи интерфейсов IAcadApplication и IAcadPreferences

Рассмотрим следующий сценарий: в AcRx::kInitAppMsg сохраним текущий профиль и установим другой, а в AcRx::kUnloadAppMsg мы хотим восстановить предыдущий профиль. Никаких проблем нет установить профиль в AcRx::kInitAppMsg, но в AcRx::kUnloadAppMsg мы не можем получит активный ActiveX объект AutoCAD используя GetActiveObject(). Вызов GetActiveObject() вернёт MK_E_UNAVAILABLE вместо S_OK

Проблема в том, что AutoCAD отменяет регистрацию своего ActiveX объекта приложения перед выгрузкой ObjectARX-модулей и соответственно мы не можем получить доступ к ActiveX интерфейсу AutoCAD при уведомлении AcRx::kUnloadAppMsg. Так же не работает и в AcRx:: kPreQuitMsg.

Когда AutoCAD завершается он выполняет следующие действия:

1. Отменяет регистрацию ActiveX объекта приложения (удаляет его из таблицы выполняемых объектов - ROT).
2. Посылает kPreQuitMsg каждому загруженному ObjectARX-приложению.
3. Посылает kUnloadAppMsg каждому загруженному ObjectARX-приложению прежде чем выгрузить его.

Поэтому нельзя использовать  ActiveX интерфейс AutoCAD в уведомлении kUnloadAppMsg. Вы можете обойти эту проблему используя реактор. Вы можете отреагировать на событие AcEditorReactor::databaseToBeDestroyed(), но результатом этого будет сброс профиля каждый раз, когда пользователь открывает или создаёт новый чертеж. Так что необходимо устанавливать ваш профиль при каждом открытии или создании чертежа.

Источник: http://adndevblog.typepad.com/autocad/2013/01/using-autocads-activex-interface-on-shutdown.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=205

Опубликовано 09.09.2013