Использование 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